home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / src / exampleCode / opengl / toogl / toogl.c++ < prev   
C/C++ Source or Header  |  1996-11-11  |  78KB  |  1,365 lines

  1. /*
  2.  * Copyright (c) 1992, 1993 Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that (i) the above copyright notices and this permission notice appear in
  7.  * all copies of the software and related documentation, and (ii) the name of
  8.  * Silicon Graphics may not be used in any advertising or publicity relating 
  9.  * to the software without the specific, prior written permission of 
  10.  * Silicon Graphics.
  11.  *
  12.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  13.  * ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, 
  14.  * ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  15.  *
  16.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, 
  17.  * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER 
  18.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF 
  19.  * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT 
  20.  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  21.  */
  22.  
  23. /*
  24.  * Conversion from GL to OpenGL...
  25.  * $Revision: 1.1 $
  26.  */
  27.  
  28. #include <stdlib.h>
  29. #include <iostream.h>
  30. #include <assert.h>
  31. #include <getopt.h>
  32.  
  33. #include "perlclass.h"
  34. #include "search.h"
  35.  
  36. static char *revision = "$Revision: 1.1 $";
  37.  
  38. static int lineno = 0;
  39. static int errors = 0;
  40. static int debug = 0;
  41. static int no_queue = 0;
  42. static int no_window = 0;
  43. static int no_comments = 0;
  44. static int no_lighting = 0;
  45. static int emulate_lighting = 0;
  46.  
  47. int matching(const char *, int offset = 0);
  48. PerlStringList split_args(PerlString &, int &ok);
  49. void replace_args(PerlString &in, const PerlStringList &args);
  50.  
  51. PerlString instr, ostr;
  52. PerlStringList comments;
  53.  
  54. static void error(char *err)
  55. {
  56.     cerr << "Error: " << err << " at line " << lineno << " of input.\n";
  57.     cerr << instr << "\n";
  58.     errors++;
  59. }
  60.  
  61. static void
  62. options(int argc, char **argv)
  63. {
  64.     int c;
  65.     
  66.     while ((c = getopt(argc,  argv, "dclLqvw")) != -1) {
  67.     switch(c) {
  68.     default:
  69.         cerr << "Usage: toogl [-clLqwv] < infile > outfile\n" ;
  70.         cerr << "    -c  don't put comments with OGLXXX into program\n";
  71.         cerr << "    -l  don't translate lighting calls (e.g. lmdef, lmbind, #defines) \n";
  72.         cerr << "    -L  translate lighting calls for emulation library (mylmdef, mylmbind) (implies -l) \n";
  73.         cerr << "    -q  don't translate event queue calls (e.g. qread, setvaluator) \n";
  74.         cerr << "    -v  print revision number.\n";
  75.         cerr << "    -w  don't translate window manager calls (e.g. winopen, mapcolor) \n";
  76.         exit (1);
  77.     case 'd':
  78.         debug = 1;
  79.         break;
  80.     case 'q':
  81.         no_queue = 1;
  82.         break;
  83.     case 'w':
  84.         no_window = 1;
  85.         break;
  86.     case 'c':
  87.         no_comments = 1;
  88.         break;
  89.     case 'l':
  90.         no_lighting = 1;
  91.         break;
  92.     case 'L':
  93.         emulate_lighting = 1;
  94.         no_lighting = 1;
  95.         break;
  96.     case 'v':
  97.         cerr << "toogl " << revision << "\n";
  98.         break;
  99.     }
  100.     }
  101. }
  102.  
  103. int read_line()
  104. {
  105.     cin >> instr;
  106.     instr = " " + instr + " ";    // add a space before and after string so regular expressions that require non-alphanumeric before and after will work.
  107.     lineno++;
  108.     return (!cin.eof()); 
  109. }
  110.  
  111.  
  112. class glThing;
  113. static glThing
  114.      *first_glThing[MAXPATTERN], **last_glThing[MAXPATTERN];
  115.  
  116.      
  117. Search search[MAXPATTERN];
  118.  
  119. class glThing {
  120.     public:
  121.     glThing(const PerlString &n) :name(n) {
  122.         // link into list of all glFuncs.
  123.         int len = n.length();
  124.         if(len > MAXPATTERN-1)
  125.         len = MAXPATTERN-1;
  126.         prev = last_glThing[len];
  127.         if(!prev) {
  128.         prev = last_glThing[len] = &first_glThing[len];
  129.         }
  130.         last_glThing[len] = &(this->nextp);
  131.         nextp = 0;
  132.         *prev = this;
  133.         search[len].add((const char *)n);
  134.     };
  135.     ~glThing() {    // can't undo search.add()
  136.         *prev = nextp;
  137.         if(nextp)
  138.         nextp->prev = prev;
  139.     };
  140.     inline glThing *next() {return nextp;};
  141.     virtual int m(PerlString &,  PerlStringList &) = 0;
  142.     virtual void replace(PerlString &in, PerlStringList &s) = 0 ;
  143.     private:
  144.     const PerlString name;
  145.         glThing *nextp, **prev;
  146.  
  147. };
  148.  
  149. //const static PerlString pre("^(.*[^a-zA-Z_0-9]+)*(");
  150. const static PerlString pre("^(.*[^a-zA-Z_0-9]+)(");  // XXX won't work at beginning of line
  151. const static PerlString post("[ \t]*)(\\(.*)$");
  152.  
  153.  
  154. class glFunc :public glThing {
  155. protected:   
  156.     Regexp re;
  157.     const PerlString restr;
  158.     const PerlString quick;
  159. public:
  160.     glFunc( const PerlString & name ) : glThing(name), re(pre+name+post), restr(pre+name+post), quick(name) {
  161.     };
  162.     
  163.     ~glFunc() {
  164.     };
  165.     
  166.     virtual int m( PerlString & f, PerlStringList & s) {
  167.     int ret = 0;
  168.     if(f.length() && f[0] && (-1 != f.index(quick))) {    // don't try to match null strings
  169.         /* The re breaks it into:
  170.          * (stuff before name) -- verify no alphanumeric prefixed to name
  171.          * (name including whitespace up to '('))
  172.          * ('(' plus stuff after '(' to end of line)))
  173.          * 
  174.          * further processing breaks it into:
  175.          * (stuff before name)            [0]
  176.          * (name including whitespace up to '('))    [1]
  177.          * a '('                    [2]
  178.          * arg1                    [3]
  179.          * arg2
  180.          * ...                
  181.          * argn                    [nargs+2]        
  182.          * closing ')'                [nargs+3]
  183.          * rest of line                [nargs+4]
  184.          * note:there is ALWAYS at least 1 arg string
  185.          */
  186.         int i = f.m(re, s);
  187.         s.shift();    // drop match of whole line
  188.         i--;
  189. //        assert(i == -1 || i == 3);    // re either matches or doesn't
  190.         if(i == 3) {
  191.         int ok;
  192.         PerlString rest(s[2]);
  193.         s.pop();
  194.         s.push(split_args(rest, ok));
  195.         if(ok)
  196.             ret = s.scalar();
  197.         } else if (i != -1) {
  198.         cerr << "Internal Error, wierd re match:(" << i << ")\n" << s.join("\n") << "\nRE:" << restr << '\n';
  199.         }
  200.     } 
  201.     return ret;
  202.     };
  203.     
  204.     virtual void replace(PerlString &in, PerlStringList &s) = 0 ;
  205.     
  206. };
  207.  
  208.  
  209.  
  210. // gl functions with no args -- only whitespace allowed inside ()'s
  211. class glSimple:public glFunc {
  212. public:
  213.     glSimple(const PerlString &s, const PerlString &r)
  214.     :glFunc(s), rep(r), comments(PerlString("")) { 
  215.     };
  216.  
  217.     glSimple(const PerlString &s, const PerlString &r, const PerlString &c)
  218.     :glFunc(s), rep(r), comments(c){ 
  219.     };
  220.     
  221.     
  222.     ~glSimple() {};
  223.  
  224.        
  225.     virtual void replace(PerlString &in, PerlStringList &s) {
  226.     s[1] = rep;
  227.     int nargs = s.scalar() - 5;
  228.     s.splice(2, nargs+2);        // remove "( )" elements
  229.     in = s.join("");
  230.     ::comments.push(comments.split("#"));
  231.     };
  232.  
  233.  
  234. private:
  235.     const PerlString rep;
  236.     PerlString comments;
  237. };
  238.  
  239. // gl functions, possibly with args, to be deleted
  240. // These are special: entire function is copied into comments.
  241. class glDelete: public glFunc {
  242. public:
  243.     glDelete(const PerlString &s, const PerlString &c) 
  244.     : glFunc(s), comments(c) {
  245.     };
  246.     ~glDelete() {};
  247.  
  248.  
  249.     virtual void replace(PerlString &in, PerlStringList &s) {
  250.     ::comments.push(comments.split("#"));
  251.     int nargs = s.scalar() - 5;
  252.     PerlString f(s[1]);
  253.     PerlStringList args(6);
  254.     args = s.splice(3, nargs);
  255.     f += "(" + args.join(",") + ")";    // move args to f 
  256.     ::comments.push(f);
  257.     s.splice(2, 2);    // remove "()"
  258.     s[1] = "/*DELETED*/";    // replace name
  259.     in = s.join("");
  260.     };
  261.  
  262. private:
  263.     PerlString comments;
  264. };
  265.  
  266. // gl Functions with args
  267. class glArgs: public glFunc {
  268. public:
  269.     glArgs(const PerlString &s, const PerlString &r, const PerlString &c) 
  270.     : glFunc(s), rep(r), comments(c) {
  271.     };
  272.     glArgs(const PerlString &s, const PerlString &r) 
  273.     : glFunc(s), rep(r), comments("") {
  274.     };
  275.     ~glArgs() {};
  276.  
  277.    
  278.     virtual void replace(PerlString &in, PerlStringList &s) {
  279.     PerlStringList argz(6);
  280.     int nargs = s.scalar() - 5;
  281.     s[1] = rep;
  282.     argz.push((s.splice(2, nargs+2)));
  283.     argz.shift();
  284.     argz.pop();        // drop '(' and ')'
  285.     replace_args(s[1], argz);
  286.     in = s.join("");
  287.     ::comments.push(comments.split("#"));
  288.     };
  289.  
  290.  
  291. private:
  292.     const PerlString rep;
  293.     PerlString comments;
  294. };
  295.  
  296. const static PerlString defpre("^(.*[^a-zA-Z_0-9]+)(");  // XXX won't work at beginning of line
  297. const static PerlString defpost(")([^a-zA-Z_0-9]+.*)$"); // XXX won't work at end of line
  298.  
  299. class glDefine :public glThing {
  300. private:   
  301.     Regexp re;
  302.     const PerlString restr;
  303.     const PerlString quick;
  304.     const PerlString rep;
  305.     PerlString comments;
  306. public:
  307.     glDefine( const PerlString & name, const PerlString &repl, const PerlString &com ) : glThing(name), re(defpre+name+defpost), restr(defpre+name+defpost), quick(name), rep(repl), comments(com) {
  308.     };
  309.     glDefine( const PerlString & name, const PerlString &repl ) : glThing(name), re(defpre+name+defpost), restr(defpre+name+defpost), quick(name), rep(repl), comments("") {
  310.     };
  311.     
  312.     ~glDefine() {
  313.     };
  314.     
  315.     virtual int m( PerlString & f, PerlStringList & s) {
  316.     if(f.length() && f[0] && (-1 != f.index(quick))) {    // don't try to match null strings
  317.         /* The re breaks it into:
  318.          * (stuff before name)
  319.          * (name)
  320.          * (stuff after name)
  321.          */
  322.         int i = f.m(re, s);
  323.         if(i) {
  324.         s.shift();    // drop match of whole line
  325.         return s.scalar();
  326.         } else
  327.         return 0;
  328.     } else
  329.         return 0;
  330.     };
  331.     
  332.     virtual void replace(PerlString &in, PerlStringList &s) {
  333.     s[1] = rep;
  334.     in = s.join("");
  335.     ::comments.push(comments.split("#"));
  336.     };
  337.     
  338. };
  339.  
  340.  
  341. glSimple simples[] = {
  342.     glSimple("bgnqstrip", "glBegin(GL_QUAD_STRIP)"),
  343.     glSimple("endqstrip", "glEnd()"),
  344.     glSimple("bgntmesh", "glBegin(GL_TRIANGLE_STRIP)"),
  345.     glSimple("endtmesh", "glEnd()"),
  346.     glSimple("bgnline", "glBegin(GL_LINE_STRIP)", "for multiple, independent line segments: use GL_LINES"),
  347.     glSimple("endline", "glEnd()"),
  348.     glSimple("bgnclosedline", "glBegin(GL_LINE_LOOP)"),
  349.     glSimple("endclosedline", "glEnd()"),
  350.     glSimple("bgnpoint", "glBegin(GL_POINTS)"),
  351.     glSimple("endpoint", "glEnd()"),
  352.     glSimple("bgnpolygon", "glBegin(GL_POLYGON)", "special cases for polygons:#\tindependant quads: use GL_QUADS#\tindependent triangles: use GL_TRIANGLES"),
  353.     glSimple("endpolygon", "glEnd()"),
  354.     glSimple("pushmatrix", "glPushMatrix()"),
  355.     glSimple("popmatrix", "glPopMatrix()"),
  356.     glSimple("clear", "glClearIndex(index);glClearColor(r, g, b, a); glClear(GL_COLOR_BUFFER_BIT)", "clear: use only one of glCLearIndex or glClearColor,#and change index or r, g, b, a to correct values"),
  357.     glSimple("zclear", "glClearDepth(1.); glClear(GL_DEPTH_BUFFER_BIT)"),
  358.     glSimple("getshade", "(glGetIntegerv(GL_CURRENT_INDEX, &gctmp),  gctmp)", "getcolor:#GLint gctmp;"),  
  359.     glSimple("getcolor", "(glGetIntegerv(GL_CURRENT_INDEX, &gstmp), gstmp)", "getshade:#GLint gctmp;"),  
  360.     glSimple("bgncurve", "gluBeginCurve( obj )", "replace obj with your GLUnurbsObj*"),  
  361.     glSimple("bgnsurface", "gluBeginSurface( obj )", "replace obj with your GLUnurbsObj*"),  
  362.     glSimple("bgntrim", "gluBeginTrim( obj )", "replace obj with your GLUnurbsObj*"),  
  363.     glSimple("closeobj", "glEndList()"),
  364.     glSimple("endcurve", "gluEndCurve( obj )", "replace obj with your GLUnurbsObj*"),  
  365.     glSimple("endfeedback", "glRenderMode(GL_RENDER)"),  
  366.     glSimple("endselect", "glRenderMode(GL_RENDER)"), 
  367.     glSimple("endsurface", "gluEndSurface( obj )", "replace obj with your GLUnurbsObj*"),  
  368.     glSimple("endtrim", "gluEndTrim( obj )", "replace obj with your GLUnurbsObj*"),  
  369.     glSimple("finish", "glFinish()"),  
  370.     glSimple("genobj", "glGenLists(1)", "glGenLists: change range param to get more than one"),  
  371.     glSimple("getdcm", "glIsEnabled(GL_FOG)", "depthcue supported by GL_FOG"),  
  372.     glSimple("initnames", "glInitNames()"),  
  373.     glSimple("pclos", "glEnd()"),  
  374.     glSimple("popattributes", "glPopAttrib()"),
  375.     glSimple("popname", "glPopName()"),
  376.     glSimple("popviewport", "glPopAttrib()", "popviewport: see glPopAttrib man page"),
  377.     glSimple("pushattributes", "glPushAttrib(GL_ALL_ATTRIB_BITS)"),
  378.     glSimple("pushviewport", "glPushAttrib(GL_VIEWPORT_BIT)"),
  379. };
  380.  
  381. glDelete deletes[] = {
  382.     glDelete("addtopup", "addtopup not supported"), 
  383.     glDelete("subpixel", "always subpixel"), 
  384.     glDelete("gconfig",  "gconfig not supported:#\tcollect glxChooseVisual attributes into one list for visual selection"), 
  385.     glDelete("concave", "use gluBeginPolygon(tobj) to draw concave polys"),  
  386.     glDelete("endpupmode", "endpupmode obsolete"),  
  387.     glDelete("getothermonitor", "getothermonitor obsolete"),  
  388.     glDelete("gRGBcursor", "gRGBcursor obsolete"),  
  389.     glDelete("ismex", "ismex obsolete -- (always TRUE)"),  
  390.     glDelete("pupmode", "pupmode obsolete"),
  391.     glDelete("spclos", "spclos obsolete"),  
  392.     glDelete("swaptmesh", "swaptmesh not supported, maybe glBegin(GL_TRIANGLE_FAN)"),  
  393.     glDelete("RGBrange", "RGBrange not supported, see glFog()"),  // XXX
  394.     glDelete("lRGBrange", "lRGBrange not supported, see glFog()"),  // XXX
  395.     glDelete("shaderange", "shaderange not supported, see glFog()"),  // XXX
  396.     glDelete("lshaderange", "lshaderange not supported, see glFog()"),  // XXX
  397.     glDelete("callfunc", "callfunc not supported"),
  398.     glDelete("chunksize", "chunksize not supported"),
  399.     glDelete("clearhitcode", "clearhitcode not supported"),
  400.     glDelete("compactify", "compactify not supported"),
  401.     glDelete("curveit", "curveit not supported, see glEvalMesh()"),
  402.     glDelete("defbasis", "defbasis not supported, see glEvalMesh()"),
  403.     glDelete("deflfont", "deflfont not supported, see glCallLists()"),
  404.     glDelete("defpup", "defpup not supported"),
  405.     glDelete("deltag", "deltag not supported"),
  406.     glDelete("depthcue", "depthcue not supported, See glFog()"),// XXX do better
  407.     glDelete("dopup", "dopup not supported"),
  408.     glDelete("editobj", "editobj not supported# -- use display list hierarchy"),
  409.     glDelete("foreground", "foreground not supported -- see fork man page"),
  410.     glDelete("freepup", "freepup not supported"),
  411.     glDelete("bbox2", "bbox2 not supported"),
  412.     glDelete("bbox2i", "bbox2i not supported"),
  413.     glDelete("bbox2s", "bbox2s not supported"),
  414.     glDelete("gentag", "gentag not supported -- use display list hierarchy"),
  415.     glDelete("getdescender", "getdescender not supported"),
  416.     glDelete("getfont", "getfont not supported"),
  417.     glDelete("getheight", "getheight not supported"),
  418.     glDelete("gethitcode", "gethitcode not supported"),
  419.     glDelete("getlsbackup", "getlsbackup not supported"),
  420.     glDelete("getlstyle", "getlstyle not supported"),
  421.     glDelete("getresetls", "getresetls not supported"),
  422.     glDelete("getscrbox", "getscrbox not supported"),
  423.     glDelete("glcompat", "glcompat not supported"),
  424.     glDelete("gsync", "gsync not supported"),
  425.     glDelete("gversion", "gversion not supported -- how about \"OpenGL\"?"),
  426.     glDelete("istag", "istag not supported -- use display list hierarchy"),
  427.     glDelete("lsbackup", "lsbackup not supported"),
  428.     glDelete("maketag", "maketag not supported -- use display list hierarchy"),
  429.     glDelete("newpup", "newpup not supported"),
  430.     glDelete("newtag", "newtag not supported -- use display list hierarchy"),
  431.     glDelete("objinsert", "objinsert not supported -- use display list hierarchy"),
  432.     glDelete("objreplace", "objreplace not supported -- use display list hierarchy"),
  433.     glDelete("pagecolor", "pagecolor not supported"),
  434.     glDelete("resetls", "resetls not supported"),
  435.     glDelete("scrbox", "scrbox not supported"),
  436.     glDelete("setpup", "setpup not supported -- See Window Manager"),
  437.     glDelete("strwidth", "strwidth not supported -- See Fonts"),
  438.     glDelete("lstrwidth", "lstrwidth not supported -- See Fonts"),
  439.     glDelete("swapinterval", "swapinterval not supported -- See MBX"),
  440.     glDelete("zdraw", "zdraw not supported -- See stencil for similar functions"),
  441.     glDelete("zsource", "zsource not supported"),
  442.     glDelete("getgpos", "getgpos -- graphics position not supported"),
  443.     glDelete("patch", "patch not supported, see gluNurbsSurface man page"),
  444.     glDelete("rpatch", "rpatch not supported, see gluNurbsSurface man page"),
  445.     glDelete("patchbasis", "patchbassis not supported, see gluNurbsSurface man page"),
  446.     glDelete("patchcurves", "patchcurves not supported, see gluNurbsSurface man page"),
  447.     glDelete("patchprecision", "patchprecision not supported, see gluNurbsSurface man page"),
  448.     glDelete("rcrv", "rcrv not supported -- see gluNurbsCurve man page"),
  449.     glDelete("rcrvn", "rcrvn not supported -- see gluNurbsCurve man page"),
  450.     glDelete("xfpt", "xfpt not supported -- see gluProject man page"),
  451.     glDelete("xfpti", "xfpti not supported -- see gluProject man page"),
  452.     glDelete("xfpts", "xfpts not supported -- see gluProject man page"),
  453.     glDelete("xfpt2", "xfpt2 not supported -- see gluProject man page"),
  454.     glDelete("xfpt2i", "xfpt2i not supported -- see gluProject man page"),
  455.     glDelete("xfpt2s", "xfpt2s not supported -- see gluProject man page"),
  456.     glDelete("xfpt4", "xfpt4 not supported -- see gluProject man page"),
  457.     glDelete("xfpt4i", "xfpt4i not supported -- see gluProject man page"),
  458.     glDelete("xfpt4s", "xfpt4s not supported -- see gluProject man page"),
  459.     glDelete("scrsubdivide", "scrsubdivide not needed."),
  460.     glDelete("Tag", "Object tags not supported"),
  461.     glDelete("Offset", "Object tags not supported"),
  462.     glDelete("Cursor", "Cursor -- use Window Manager"),
  463.     glDelete("Device", "Device -- use Window Manager"),
  464. };
  465.  
  466.  
  467. glArgs args[] = {
  468.     glArgs("c3f", "glColor3fv($1)"),
  469.     glArgs("c3s", "glColor3sv($1)", "color values need to be scaled"),  // XXX
  470.     glArgs("c3i", "glColor3iv($1)", "color values need to be scaled"),  // XXX
  471.     glArgs("c4f", "glColor4fv($1)"),
  472.     glArgs("c4s", "glColor4sv($1)", "color values need to be scaled"),  // XXX
  473.     glArgs("c4i", "glColor4iv($1)", "color values need to be scaled"),  // XXX
  474.     glArgs("v2f", "glVertex2fv($1)"), 
  475.     glArgs("v2s", "glVertex2sv($1)"), 
  476.     glArgs("v2i", "glVertex2iv($1)"), 
  477.     glArgs("v2d", "glVertex2dv($1)"), 
  478.     glArgs("v3f", "glVertex3fv($1)"), 
  479.     glArgs("v3s", "glVertex3sv($1)"), 
  480.     glArgs("v3i", "glVertex3iv($1)"), 
  481.     glArgs("v3d", "glVertex3dv($1)"), 
  482.     glArgs("v4f", "glVertex4fv($1)"), 
  483.     glArgs("v4s", "glVertex4sv($1)"), 
  484.     glArgs("v4i", "glVertex4iv($1)"), 
  485.     glArgs("v4d", "glVertex4dv($1)"), 
  486.     glArgs("n3f", "glNormal3fv($1)"), 
  487.     glArgs("t2f", "glTexCoord2fv($1)"), 
  488.     glArgs("t3f", "glTexCoord3fv($1)"), 
  489.     glArgs("t2s", "glTexCoord2sv($1)"), 
  490.     glArgs("t2i", "glTexCoord2iv($1)"), 
  491.     glArgs("t2d", "glTexCoord2dv($1)"), 
  492.     glArgs("translate", "glTranslatef($1, $2, $3)"), 
  493.     glArgs("loadmatrix", "glLoadMatrixf($1)"), 
  494.     glArgs("multmatrix", "glMultMatrixf($1)"), 
  495.     glArgs("RGBcolor", "glColor3ub($1, $2, $3)"), 
  496.     glArgs("normal", "glNormal3fv($1)"),
  497.     glArgs("blendfunction", "glBlendFunc($1, $2); if(($1) == GL_ONE && ($2) == GL_ZERO) glDisable(GL_BLEND) else glEnable(GL_BLEND)"),
  498.     glArgs("callobj", "glCallList($1)", "check list numbering"), 
  499.     glArgs("charstr", "glCallLists(strlen($1), GL_UNSIGNED_BYTE, $1)", "charstr: check list numbering"), // XXX what list definitions need to be done before this works?
  500.     glArgs("cmov", "glRasterPos3f($1, $2, $3)"),
  501.     glArgs("cmov2", "glRasterPos2f($1, $2)"),
  502.     glArgs("cmov2i", "glRasterPos2i($1, $2)"),
  503.     glArgs("cmov2s", "glRasterPos2s($1, $2)"),
  504.     glArgs("cmovi", "glRasterPos3i($1, $2, $3)"),
  505.     glArgs("cmovs", "glRasterPos3s($1, $2, $3)"),
  506.     glArgs("color", "glIndexi($1)"),
  507.     glArgs("colorf", "glIndexf($1)"),
  508.     glArgs("setshade", "glIndexi($1)"),
  509.     glArgs("font", "glListBase(int n)", "see glListBase info"),
  510.     glArgs("afunction", "glAlphaFunc($2, ($1)/255.); if(($2)==GL_ALWAYS) glDisable(GL_ALPHA_TEST) else glEnable(GL_ALPHA_TEST)"),
  511.     glArgs("acbuf", "glAccum($1, $2)"),    // XXX translate params?
  512.     glArgs("getdepth", "{GLint get_depth_tmp[2];glGetIntegerv(GL_DEPTH_RANGE, get_depth_tmp);*($1)=get_depth_tmp[0];*($2)=get_depth_tmp[1];}", "You can probably do better than this."),  
  513.     glArgs("smoothline", "if($1) glEnable(GL_LINE_SMOOTH); else glDisable(GL_LINE_SMOOTH)"),    // args to smoothline?  
  514.     glArgs("linesmooth", "if($1) glEnable(GL_LINE_SMOOTH); else glDisable(GL_LINE_SMOOTH)"),    // args to linesmooth?  
  515.     glArgs("polysmooth", "if($1) glEnable(GL_POLYGON_SMOOTH); else glDisable(GL_POLYGON_SMOOTH)"),
  516.     glArgs("arc", "{ GLUquadricObj *qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); glPushMatrix(); glTranslatef($1, $2,  0.); gluPartialDisk( qobj, 0., $3, 32, 1, ($4)*.1, (($5)-($4))*.1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluPartialDisk man page."),
  517.     glArgs("arci", "{ GLUquadricObj *qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); glPushMatrix(); glTranslatef($1, $2, 0.); gluPartialDisk( qobj, 0., $3, 32, 1, ($4)*.1, (($5)-($4))*.1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluPartialDisk man page."),
  518.     glArgs("arcs", "{ GLUquadricObj *qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); glPushMatrix(); glTranslatef($1, $2, 0.); gluPartialDisk( qobj, 0., $3, 32, 1, ($4)*.1, (($5)-($4))*.1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluPartialDisk man page."),
  519.     glArgs("arcf", "{ GLUquadricObj *qobj = gluNewQuadric(); glPushMatrix(); glTranslatef($1, $2, 0.); gluPartialDisk( qobj, 0., $3, 32, 1, ($4)*.1, (($5)-($4))*.1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluPartialDisk man page."),
  520.     glArgs("arcfi", "{ GLUquadricObj *qobj = gluNewQuadric(); glPushMatrix(); glTranslatef($1, $2, 0.); gluPartialDisk( qobj, 0., $3, 32, 1, ($4)*.1, (($5)-($4))*.1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluPartialDisk man page."),
  521.     glArgs("arcfs", "{ GLUquadricObj *qobj = gluNewQuadric(); glPushMatrix(); glTranslatef($1, $2, 0.); gluPartialDisk( qobj, 0., $3, 32, 1, ($4)*.1, (($5)-($4))*.1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluPartialDisk man page."),
  522.     glArgs("circ", "{ GLUquadricObj *qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); glPushMatrix(); glTranslate($1, $2, 0.); gluDisk( qobj, 0., $3, 32, 1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluDisk man page."),
  523.     glArgs("circi", "{ GLUquadricObj *qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); glPushMatrix(); glTranslate($1, $2, 0.); gluDisk( qobj, 0., $3, 32, 1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluDisk man page."),
  524.     glArgs("circs", "{ GLUquadricObj *qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); glPushMatrix(); glTranslate($1, $2, 0.); gluDisk( qobj, 0., $3, 32, 1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluDisk man page."),
  525.     glArgs("circf", "{ GLUquadricObj *qobj = gluNewQuadric(); glPushMatrix(); glTranslate($1, $2, 0.); gluDisk( qobj, 0., $3, 32, 1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluDisk man page."),
  526.     glArgs("circfi", "{ GLUquadricObj *qobj = gluNewQuadric(); glPushMatrix(); glTranslate($1, $2, 0.); gluDisk( qobj, 0., $3, 32, 1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluDisk man page."),
  527.     glArgs("circfs", "{ GLUquadricObj *qobj = gluNewQuadric(); glPushMatrix(); glTranslate($1, $2, 0.); gluDisk( qobj, 0., $3, 32, 1); glPopMatrix(); gluDeleteQuadric(qobj); }", "See gluDisk man page."),
  528.     glArgs("callobj", "glCallList($1)", "check list numbering"),
  529.     glArgs("clipplane", "glClipPlane( GL_CLIP_PLANE0+($1), *equation); if($2) glEnable(GL_CLIP_PLANE+($1)); else glDisable(GL_CLIP_PLANE0+($1))", "see man page for glClipPlane equation"),
  530.     glArgs("cpack", "glColor4ubv(&($1))", "cpack: if argument is not a variable#might need to be:#\tglColor4b(($1)&0xff, ($1)>>8&0xff, ($1)>>16&0xff, ($1)>>24&0xff)"),
  531.     glArgs("crv", "glEvalCoord1f( u )", "replace u with domain coordinate"),
  532.     glArgs("crvn", "glEvalMesh1f(GL_LINE, 0, n-1 )", "replace n with domain coordinate index"),
  533.     glArgs("curvebasis", "glMap1();glMap2();glMapGrid()", "curvebasis: see man pages"),
  534.     glArgs("curveprecision", "glMap1();glMap2();glMapGrid()", "curveprecision:see man pages"),
  535.     glArgs("czclear", "glClearDepth($2);glClearColor(((float)(($1)&0xff))/255., (float)(($1)>>8&0xff)/255., (float)(($1)>>16&0xff)/255., (float)(($1)>>24&0xff)/255. );glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT)", "change glClearDepth parameter to be in [0, 1]"),// pattern behavior?
  536.     glArgs("deflinestyle", "glNewList($1, GL_COMPILE);glLineStipple(factor, $2); glEndList()", "LineStipple:#\tget factor from lsrepeat()#\tYou don't really need to make a display list.#\tCheck list numbering."),
  537.     glArgs("setlinestyle", "if($1) {glCallList($1); glEnable(GL_LINE_STIPPLE);} else glDisable(GL_LINE_STIPPLE)", "setlinestyle: Check list numbering."),
  538.     glArgs("defpattern", "glNewList($1, GL_COMPILE); glPolygonStipple(MASK($3)); glEndList()", "glPolygonStipple:#\tSee man page to change $3 into mask.#\tYou don't really need to make a display list.#\tCheck list numbering."),
  539.     glArgs("defrasterfont", "glXUseXFont( font, first, count, listBase)", "glXUseFont: see man page"), 
  540.     glArgs("delobj", "glDeleteLists( $1, 1)", "glDeleteLists: check object numbers"), 
  541.     glArgs("dither", "if($1) glEnable(GL_DITHER); else glDisable(GL_DITHER)"), 
  542.     glArgs("drawmode", "glxChooseVisual(*display, screen, *attriblist)", "glxChooseVisual: add $1 to attriblist"), 
  543.     glArgs("acsize", "glxChooseVisual(*display, screen, *attriblist)", "glxChooseVisual: add GLX_ACCUM_RED_SIZE, $1, etc. to attriblist"), 
  544.     glArgs("endpick", "glRenderMode(GL_RENDER); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective( fovy, aspect, znear, zfar ); glMatrixMode(GL_MODELVIEW);", "endpick:#\treplace gluPerspective args#\tor use glPopMatrix() to restore."), 
  545.     glArgs("feedback", "glFeedbackBuffer($2, GL_3D_COLOR, $1); glRenderMode(GL_FEEDBACK);"), 
  546.     glArgs("fogvertex", "glFogfv($1, $2); if($1) glEnable(GL_FOG); else glDisable(GL_FOG)", "Fog: have to translate params."), 
  547.     glArgs("frontbuffer", "glDrawBuffer(($1) ? GL_FRONT : GL_BACK)", "frontbuffer: other possibilities include GL_FRONT_AND_BACK"),
  548.     glArgs("backbuffer", "glDrawBuffer(($1) ? GL_BACK : GL_FRONT)", "backbuffer: other possibilities include GL_FRONT_AND_BACK"),
  549.     glArgs("frontface", "glCullFace(($1) ? GL_FRONT : GL_BACK); ($1) ? glEnable(GL_CULL_FACE):glDisable(GL_CULL_FACE)"),
  550.     glArgs("backface", "glCullFace(!($1) ? GL_FRONT : GL_BACK); ($1) ? glEnable(GL_CULL_FACE):glDisable(GL_CULL_FACE)"),
  551.     glArgs("draw", "glVertex3f($1, $2, $3)", "Add glEnd() after these vertices,  before next glBegin()"), 
  552.     glArgs("draw2", "glVertex2f($1, $2)","Add glEnd() after these vertices,  before next glBegin()"), 
  553.     glArgs("draw2i", "glVertex2i($1, $2)","Add glEnd() after these vertices,  before next glBegin()"), 
  554.     glArgs("draw2s", "glVertex2s($1, $2)","Add glEnd() after these vertices,  before next glBegin()"), 
  555.     glArgs("drawi", "glVertex3i($1, $2, $3)","Add glEnd() after these vertices,  before next glBegin()"), 
  556.     glArgs("draws", "glVertex3s($1, $2, $3)","Add glEnd() after these vertices,  before next glBegin()"), 
  557.     glArgs("move", "glBegin(GL_LINE_STRIP); glVertex3f($1, $2, $3)", "glBegin: Use GL_LINES if only one line segment is desired."), 
  558.     glArgs("move2", "glBegin(GL_LINE_STRIP); glVertex2f($1, $2)", "glBegin: Use GL_LINES if only one line segment is desired."),
  559.     glArgs("move2i", "glBegin(GL_LINE_STRIP); glVertex2i($1, $2)", "glBegin: Use GL_LINES if only one line segment is desired."),
  560.     glArgs("move2s", "glBegin(GL_LINE_STRIP); glVertex2s($1, $2)", "glBegin: Use GL_LINES if only one line segment is desired."),
  561.     glArgs("movei", "glBegin(GL_LINE_STRIP); glVertex3i($1, $2, $3)", "glBegin: Use GL_LINES if only one line segment is desired."),
  562.     glArgs("moves", "glBegin(GL_LINE_STRIP); glVertex3s($1, $2, $3)", "glBegin: Use GL_LINES if only one line segment is desired."),
  563.     glArgs("getdisplaymode", "(glGetIntegerv(GL_INDEX_MODE, &dmtmp), dmtmp)", "get display mode:#\tHow to tell if doublebuffered?#\tYou can do better than this.#GLint dmtmp;"),
  564.     glArgs("getdrawmode", "glxGetCurrentContext()", "see man page"),
  565.     glArgs("getgconfig", "(glGetIntegerv($1, &gctmp), gctmp)", "getgconfig:#GLint gctmp;"), 
  566.     glArgs("getgdesc", "(glGetIntegerv($1, &gdtmp), gdtmp)", "getgdesc other posiblilties:#\tglxGetConfig();#\tglxGetCurrentContext();#\tglxGetCurrentDrawable();#GLint gdtmp;"), 
  567.     glArgs("getmatrix", "glGetFloatv(GL_MODELVIEW_MATRIX, $1)", "getmatrix: you might mean#glGetFloatv(GL_PROJECTION_MATRIX, $1)"),
  568.     glArgs("getmmode", "(glGetIntegerv(GL_MATRIX_MODE, &gmtmp), gmtmp)", "getmmode: translate returned values#GLint mmtmp;"),
  569.     glArgs("getnurbsproperty", "gluGetNurbsProperty(GL_MATRIX_MODE, &tmp)", "see man page for gluGetNurbsProperty#move results from tmp."),
  570.     glArgs("getopenobj", "(glGetIntegerv(GL_LIST_INDEX, &tmp),  tmp)", "getopenobj: #int tmp;"),
  571.     glArgs("getpattern", "glGetPolygonStipple(mask)", "glGetPolygonStipple:#\tmask is a 32x32 array (See man page).#\tGLuByte *mask;"),
  572.     glArgs("getplanes", "(glGetIntegerv(GL_INDEX_BITS, &tmp),  tmp)", "getplanes:#int tmp;"),
  573.     glArgs("getscrmask", "{ GLint tmp[4]; glGetIntegerv(GL_SCISSOR_BOX, &tmp);*($1)=tmp[0];*($2)=tmp[0]+tmp[2]-1;*($3)=tmp[1];*($4)=tmp[1]+tmp[3]-1;}", "get GL_SCISSOR_BOX:#You can probably do better than this."),
  574.     glArgs("getsm", "(glGetIntegerv(GL_SHADE_MODEL, &tmp), tmp)", "getsm:#GLint tmp;"),
  575.     glArgs("getviewport", "{GLint tmp[4];glGetIntegerv(GL_VIEWPORT, &tmp);*($1)=tmp[0];*($2)=tmp[0]+tmp[2]-1;*($3)=tmp[1];*($4)=tmp[1]+tmp[3]-1;}", "get GL_VIEWPORT:#You can probably do better than this."),
  576.     glArgs("getwritemask", "(glGetIntegerv( (glGetIntegerv(GL_INDEX_MODE, &tmp), tmp) ? GL_INDEX_WRITEMASK : GL_COLOR_MASK, &tmp), tmp)", "getwritemask:#GLint tmp;"),
  577.     glArgs("getzbuffer", "glIsEnabled(GL_DEPTH_TEST)"),
  578.     glArgs("gflush", "glFlush()"),
  579.     glArgs("gRGBcolor", "{int tmp[4]; glGetIntegerv(GL_CURRENT_COLOR, tmp);*($1)=tmp[0];*($2)=tmp[1];*($3)=tmp[2];}", "get GL_CURRENT_COLOR: scale color values"), 
  580.     glArgs("gRGBmask", "{GLboolean tmp[4]; glGetBooleanv(GL_COLOR_WRITEMASK, tmp);*($1)=tmp[0];*($2)=tmp[1];*($3)=tmp[2];}"), 
  581.     glArgs("gselect", "glSelectBuffer($2, $1); glRenderMode(GL_SELECT)"),
  582.     glArgs("isobj", "glIsList($1)", "glIsList: check object numbering"), 
  583.     glArgs("lcharstr", "glCallLists(lstrlen($2), $1, $2)", "lcharstr: replace lstrlen with strlen(string) like function"), 
  584.     glArgs("linewidthf", "glLineWidth($1)"), 
  585.     glArgs("linewidth", "glLineWidth((GLfloat)($1))"),
  586.     glArgs("getlwidth", "(glGetIntegerv(GL_LINE_WIDTH, &tmp), tmp)", "line width:#Could also be:#float tmp;#glGetFloatv(GL_LINE_WIDTH, &tmp);"),
  587.     glArgs("lmcolor", "glColorMaterial(GL_FRONT_AND_BACK, $1);glEnable(GL_COLOR_MATERIAL)", "lmcolor: if LMC_NULL,  use:#glDisable(GL_COLOR_MATERIAL);"),
  588.     glArgs("loadmatrix", "glLoadMatrix($1)"),
  589.     glArgs("loadname", "glLoadName($1)"),
  590.     glArgs("logicop", "glLogicOp($1); if($1 == GL_COPY) glDisable(GL_LOGIC_OP); else glEnable(GL_LOGIC_OP)"),
  591.     glArgs("lookat", "gluLookat($1, $2, $3, $4, $5, $6, UPX($7), UPY($7), UPZ($7))", "lookat: replace UPx with vector"),
  592.     glArgs("lrectread", "glReadPixels($1, $2, ($3)-($1)+1, ($4)-($2)+1, GL_RGBA, GL_BYTE, $5)", "lrectread: see man page for glReadPixels"),
  593.     glArgs("rectread", "glReadPixels($1, $2, ($3)-($1)+1, ($4)-($2)+1, GL_COLOR_INDEX, GL_SHORT, $5)", "rectread: see man page for glReadPixels"),
  594.     glArgs("lrectwrite", "glRasterPos2i($1, $2);glDrawPixels(($3)-($1)+1, ($4)-($2)+1, GL_RGBA, GL_BYTE, $5)", "lrectwrite: see man page for glDrawPixels"),
  595.     glArgs("rectwrite", "glRasterPos2i($1, $2);glDrawPixels(($3)-($1)+1, ($4)-($2)+1, GL_COLOR_INDEX, GL_SHORT, $5)", "rectwrite: see man page for glDrawPixels"),
  596.     glArgs("lsetdepth", "glDepthRange($1, $2)", "glDepthRange params must be scaled to [0, 1]"),
  597.     glArgs("setdepth", "glDepthRange($1, $2)", "glDepthRange params must be scaled to [0, 1]"),
  598.     glArgs("lsrepeat", "glLineStipple($1, pattern)", "lsrepeat: combine with pattern from deflinestyle"),
  599.     glArgs("getlsrepeat", "glGetIntegerv(GL_LINE_STIPPLE_REPEAT, &tmp)", "getlsrepeat: move tmp into your variable."),
  600.     glArgs("makeobj", "glNewList($1, GL_COMPILE)", "Check list numbering."),
  601.     glArgs("mapw", "gluProject(XXX)", "XXX I think this is backwards"),
  602.     glArgs("mapw2", "gluProject(XXX)", "XXX I think this is backwards"),
  603.     glArgs("mmode", "glMatrixMode($1)"),
  604.     glArgs("nmode", "if($1) glEnable(GL_NORMALIZE); else glDisable(GL_NORMALIZE)"),
  605.     glArgs("noport", "glxCreateGLXPixmap(*display, *visual, pixmap)", "noport: see man page"),
  606.     glArgs("nurbscurve", "gluNurbsCurve(*nobj, $1, $2, $3, $4, $5, $6)", "gluNurbsCurve: replace nobj with your object#See man page"),
  607.     glArgs("nurbssurface", "gluNurbsSurface(*nobj, $1, $2, $3, $4, $5, $6, $7, $8, $9, $a)", "gluNurbsCurve: replace nobj with your object#See man page"),
  608.     glArgs("objdelete", "glDeleteLists(LIST($1, $2), RANGE($1, $2))", "objdelete: tags not supported#See glDeleteLists man page."),
  609.     glArgs("ortho", "{GLint mm; glGetIntegerv(GL_MATRIX_MODE, &mm);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho($1, $2, $3, $4, $5, $6);glMatrixMode(mm);}"),
  610.     glArgs("ortho2", "{GLint mm; glGetIntegerv(GL_MATRIX_MODE, &mm);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D($1, $2, $3, $4);glMatrixMode(mm);}"),
  611.     glArgs("overlay",  "glxChooseVisual(*dpy, screen, *attriblist)", "overlay: use GLX_BUFFER_SIZE $1, GLX_LEVEL 1 in attriblist"), 
  612.     glArgs("underlay",  "glxChooseVisual(*dpy, screen, *attriblist)", "underlay: use GLX_BUFFER_SIZE $1, GLX_LEVEL -1 in attriblist"), 
  613.     glArgs("passthrough", "glPassThrough($1)"),
  614.     glArgs("pdr", "glVertex3f($1, $2, $3)"),
  615.     glArgs("pdri", "glVertex3i($1, $2, $3)"),
  616.     glArgs("pdrs", "glVertex3s($1, $2, $3)"),
  617.     glArgs("pdr2", "glVertex2f($1, $2)"),
  618.     glArgs("pdr2i", "glVertex2i($1, $2)"),
  619.     glArgs("pdr2s", "glVertex2s($1, $2)"),
  620.     glArgs("pmv", "glBegin(GL_POLYGON);glVertex3f($1, $2, $3)"),
  621.     glArgs("pmvi", "glBegin(GL_POLYGON);glVertex3i($1, $2, $3)"),
  622.     glArgs("pmvs", "glBegin(GL_POLYGON);glVertex3s($1, $2, $3)"),
  623.     glArgs("pmv2", "glBegin(GL_POLYGON);glVertex2f($1, $2)"),
  624.     glArgs("pmv2i", "glBegin(GL_POLYGON);glVertex2i($1, $2)"),
  625.     glArgs("pmv2s", "glBegin(GL_POLYGON);glVertex2s($1, $2)"),
  626.     glArgs("perspective", "{GLint mm;glGetIntegerv(GL_MATRIX_MODE, &mm);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(.1*($1), $2, $3, $4);glMatrixMode(mm);}"),
  627.     glArgs("pick", "glSelectBuffer($2, $1);glRenderMode(GL_SELECT);glMatrixMode(GL_PROJECTION);gluPickMatrix(x, y, w, h, viewport);glMatrixMode(GL_MODELVIEW)", "pick:#\tSelect buffer is type GLuint.#\tSet gluPickMatrix params.#See man pages.#\tMight want to push Projection matrix if you have endpick pop it."),
  628.     glArgs("picksize", "gluPickMatrix(x, y, $1, $2, viewport)", "picksize: merge this with other gluPickMatrix call due to pick()"),
  629.     glArgs("pixmode", "glPixelTransfer($1, $2)", "pixmode: see glPixelTransfer man page#Translate parameters."),
  630.     glArgs("pixmodef", "glPixelTransfer($1, $2)", "pixmodef: see glPixelTransfer man page#Translate parameters."),
  631.     glArgs("pnt", "glBegin(GL_POINTS);glVertex3f($1, $2, $3);glEnd()", "points: put as many vertices as possible between Begin and End"), 
  632.     glArgs("pnti", "glBegin(GL_POINTS);glVertex3i($1, $2, $3);glEnd()", "points: put as many vertices as possible between Begin and End"), 
  633.     glArgs("pnts", "glBegin(GL_POINTS);glVertex3s($1, $2, $3);glEnd()", "points: put as many vertices as possible between Begin and End"), 
  634.     glArgs("pnt2", "glBegin(GL_POINTS);glVertex2f($1, $2);glEnd()", "points: put as many vertices as possible between Begin and End"), 
  635.     glArgs("pnt2i", "glBegin(GL_POINTS);glVertex2i($1, $2);glEnd()", "points: put as many vertices as possible between Begin and End"), 
  636.     glArgs("pnt2s", "glBegin(GL_POINTS);glVertex2s($1, $2);glEnd()", "points: put as many vertices as possible between Begin and End"), 
  637.     glArgs("pntsize", "glPointSize((GLfloat)($1))"),
  638.     glArgs("pntsizef", "glPointSize((GLfloat)($1))"),
  639.     glArgs("pntsmooth", "{if($1) glEnable(GL_POINT_SMOOTH) else glDisable(GL_POINT_SMOOTH);}"),
  640.     glArgs("polf", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex3f(($2)[i]); glEnd();}"),
  641.     glArgs("polfi", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex3i(($2)[i]); glEnd();}"),
  642.     glArgs("polfs", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex3s(($2)[i]); glEnd();}"),
  643.     glArgs("polf2", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex2f(($2)[i]); glEnd();}"),
  644.     glArgs("polf2i", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex2i(($2)[i]); glEnd();}"),
  645.     glArgs("polf2s", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex2s(($2)[i]); glEnd();}"),
  646.     glArgs("poly", "{int i; glBegin(GL_LINE_LOOP); for(i = 0; i < $1; i++) glVertex3f(($2)[i]); glEnd();}"),
  647.     glArgs("polyi", "{int i; glBegin(GL_LINE_LOOP); for(i = 0; i < $1; i++) glVertex3i(($2)[i]); glEnd();}"),
  648.     glArgs("polys", "{int i; glBegin(GL_LINE_LOOP); for(i = 0; i < $1; i++) glVertex3s(($2)[i]); glEnd();}"),
  649.     glArgs("poly2", "{int i; glBegin(GL_LINE_LOOP); for(i = 0; i < $1; i++) glVertex2f(($2)[i]); glEnd();}"),
  650.     glArgs("poly2i", "{int i; glBegin(GL_LINE_LOOP); for(i = 0; i < $1; i++) glVertex2i(($2)[i]); glEnd();}"),
  651.     glArgs("poly2s", "{int i; glBegin(GL_LINE_LOOP); for(i = 0; i < $1; i++) glVertex2s(($2)[i]); glEnd();}"),
  652.     glArgs("polymode", "glPolygonMode(GL_FRONT_AND_BACK, $1)"),
  653.     glArgs("polymooth", "{if($1) glEnable(GL_POLYGON_SMOOTH) else glDisable(GL_POLYGON_SMOOTH);}"),
  654.     glArgs("pushname", "glPushName($1)"),
  655.     glArgs("pwlcurve", "gluPwlCurve(*nobj, $1, $2, $3, $4)", "gluPwlCurve: replace nobj with your object#See man page"),
  656.     glArgs("rdr", "glVertex3f($1, $2, $3)", "Add glEnd() after these vertices,  before next glBegin().#Relative drawing not supported -- change"), 
  657.     glArgs("rdr2", "glVertex2f($1, $2)","Add glEnd() after these vertices,  before next glBegin().#Relative drawing not supported -- change"), 
  658.     glArgs("rdr2i", "glVertex2i($1, $2)","Add glEnd() after these vertices,  before next glBegin().#Relative drawing not supported -- change"), 
  659.     glArgs("rdr2s", "glVertex2s($1, $2)","Add glEnd() after these vertices,  before next glBegin().#Relative drawing not supported -- change"), 
  660.     glArgs("rdri", "glVertex3i($1, $2, $3)","Add glEnd() after these vertices,  before next glBegin().#Relative drawing not supported -- change"), 
  661.     glArgs("rdrs", "glVertex3s($1, $2, $3)","Add glEnd() after these vertices,  before next glBegin().#Relative drawing not supported -- change"), 
  662.     glArgs("readdisplay", "glReadPixels($1, $2, ($3)-($1)+1, ($4)-($2)+1, GL_RGBA, GL_BYTE, $5)", "readdisplay: see man page for glReadPixels"),
  663.     glArgs("readRGB", "{ int tmp[4]; glGetIntegerv(GL_CURRENT_RASTER_POS, tmp);glReadPixels(tmp[0], tmp[1], $1, 1,  GL_RGBA, GL_BYTE, array);}", "readRGB: see man page for glReadPixels"),
  664.     glArgs("readpixels", "{ GLint tmp[4]; glGetIntegerv(GL_CURRENT_RASTER_POS, tmp);glReadPixels(tmp[0], tmp[1], $1, 1,  GL_INDEX, GL_SHORT, $2);}", "readpixels: see man page for glReadPixels"),
  665.     glArgs("readsource", "glReadBuffer($1)"),
  666.     glArgs("rect", "glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glRectf($1, $2, $3, $4); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)", "rect: remove extra PolygonMode changes"),
  667.     glArgs("recti", "glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glRecti($1, $2, $3, $4); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)", "rect: remove extra PolygonMode changes"),
  668.     glArgs("rects", "glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glRects($1, $2, $3, $4); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)", "rect: remove extra PolygonMode changes"),
  669.     glArgs("rectf", "glRectf($1, $2, $3, $4)"),
  670.     glArgs("rectfi", "glRecti($1, $2, $3, $4)"),
  671.     glArgs("rectfs", "glRects($1, $2, $3, $4)"),
  672.     glArgs("sbox", "glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glRect($1, $2, $3, $4); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)", "sbox: remove extra PolygonMode changes.#not screen-aligned -- See glRect"),
  673.     glArgs("sboxi", "glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glRecti($1, $2, $3, $4); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)", "sboxi: remove extra PolygonMode changes.#not screen-aligned -- See glRect"),
  674.     glArgs("sboxs", "glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glRects($1, $2, $3, $4); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)", "sboxs: remove extra PolygonMode changes.#not screen-aligned -- See glRect"),
  675.     glArgs("sboxf", "glRect($1, $2, $3, $4)", "sboxf not screen-aligned -- See glRect"),
  676.     glArgs("sboxfi", "glRecti($1, $2, $3, $4)", "sboxfi not screen-aligned -- See glRect"),
  677.     glArgs("sboxfs", "glRects($1, $2, $3, $4)", "sboxfs not screen-aligned -- See glRect"),
  678.     glArgs("rectcopy", "glRasterPos2i($5, $6);glCopyPixels($1, $2, $3-$1+1, $4-$2+1, GL_COLOR)"),
  679.     glArgs("rectzoom", "glPixelZoom($1, $2)"),
  680.     glArgs("RGBwritemask", "glColorMask($1, $2, $3, GL_TRUE)", "glColorMask: only Boolean values allowed"),
  681.     glArgs("rmv", "glBegin(GL_LINES); glVertex3f($1, $2, $3)", "Relative drawing not supported -- change"), 
  682.     glArgs("rmv2", "glBegin(GL_LINES); glVertex2f($1, $2)", "Relative drawing not supported -- change"),
  683.     glArgs("rmv2i", "glBegin(GL_LINES); glVertex2i($1, $2)", "Relative drawing not supported -- change"),
  684.     glArgs("rmv2s", "glBegin(GL_LINES); glVertex2s($1, $2)", "Relative drawing not supported -- change"),
  685.     glArgs("rmvi", "glBegin(GL_LINES); glVertex3i($1, $2, $3)", "Relative drawing not supported -- change"),
  686.     glArgs("rmvs", "glBegin(GL_LINES); glVertex3s($1, $2, $3)", "Relative drawing not supported -- change"),
  687.     glArgs("rot", "glRotatef($1, ($2)=='x'||($2)=='X', ($2)=='y'||($2)=='Y', ($2)=='z'||($2)=='Z')", "You can do better than this."),
  688.     glArgs("rotate", "glRotatef(.1*($1), ($2)=='x'||($2)=='X', ($2)=='y'||($2)=='Y', ($2)=='z'||($2)=='Z')", "You can do better than this."),
  689.     glArgs("rpdr", "glVertex3f($1, $2, $3)", "Relative drawing not supported -- change"),
  690.     glArgs("rpdri", "glVertex3i($1, $2, $3)", "Relative drawing not supported -- change"),
  691.     glArgs("rpdrs", "glVertex3s($1, $2, $3)", "Relative drawing not supported -- change"),
  692.     glArgs("rpdr2", "glVertex2f($1, $2)", "Relative drawing not supported -- change"),
  693.     glArgs("rpdr2i", "glVertex2i($1, $2)", "Relative drawing not supported -- change"),
  694.     glArgs("rpdr2s", "glVertex2s($1, $2)", "Relative drawing not supported -- change"),
  695.     glArgs("rpmv", "glBegin(GL_POLYGON);glVertex3f($1, $2, $3)", "Relative drawing not supported -- change"),
  696.     glArgs("rpmvi", "glBegin(GL_POLYGON);glVertex3i($1, $2, $3)", "Relative drawing not supported -- change"),
  697.     glArgs("rpmvs", "glBegin(GL_POLYGON);glVertex3s($1, $2, $3)", "Relative drawing not supported -- change"),
  698.     glArgs("rpmv2", "glBegin(GL_POLYGON);glVertex2f($1, $2)", "Relative drawing not supported -- change"),
  699.     glArgs("rpmv2i", "glBegin(GL_POLYGON);glVertex2i($1, $2)", "Relative drawing not supported -- change"),
  700.     glArgs("rpmv2s", "glBegin(GL_POLYGON);glVertex2s($1, $2)", "Relative drawing not supported -- change"),
  701.     glArgs("scale", "glScalef($1, $2, $3)"),
  702.     glArgs("sclear", "glClearStencil($1);glClear(GL_STENCIL_BUFFER_BIT)"),
  703.     glArgs("scrmask", "glScissor($1, $2, $3, $4); glEnable(GL_SCISSOR_TEST)"),
  704.     glArgs("setnurbsproperty", "gluNurbsProperty(*nobj, $1, $2)", "Replace nobj with your object -- see man page"),
  705.     glArgs("setpattern", "if($1) {glCallList($1); glEnable(GL_POLYGON_STIPPLE);} else glDisable(GL_POLYGON_STIPPLE)", "pattern: check list numbering.#See substitutions made for defpattern.#see glPolygonStipple man page."),     
  706.     glArgs("shademodel", "glShadeModel($1)"),
  707.     glArgs("splf", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex3f(($2)[i]); glEnd();}"),
  708.     glArgs("splfi", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex3i(($2)[i]); glEnd();}"),
  709.     glArgs("splfs", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex3s(($2)[i]); glEnd();}"),
  710.     glArgs("splf2", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex2f(($2)[i]); glEnd();}"),
  711.     glArgs("splf2i", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex2i(($2)[i]); glEnd();}"),
  712.     glArgs("splf2s", "{int i; glBegin(GL_POLYGON); for(i = 0; i < $1; i++) glVertex2s(($2)[i]); glEnd();}"),
  713.     glArgs("stencil", "if($1) { glEnable(GL_STENCIL_TEST);glStencilFunc($3, $2, $4); glStencilOp($5, $6, $7);} else glDisable(GL_STENCIL_TEST);"),
  714.     glArgs("stensize", "glStencilMask(0xff>>(8-($1)))"),
  715.     glArgs("swritemask", "glStencilMask($1)"),
  716.     glArgs("viewport", "glViewport($1, $3, ($2)-($1)+1, ($4)-($3)+1); glScissor($1, $3, ($2)-($1)+1, ($4)-($3)+1)"),
  717.     glArgs("window", "{GLint mm;glGetIntegerv(GL_MATRIX_MODE, &mm);glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum($1, $2, $3, $4, $5, $6);glMatrixMode(mm);}"),
  718.     glArgs("wmpack", "glColorMask(($1)&0xff, (($1)>>8)&0xff, (($1)>>16)&0xff, (($1)>>24)&0xff)"),
  719.     glArgs("writemask", "glIndexMask($1)"),
  720.     glArgs("writepixels", "glDrawPixels($1, 1, GL_COLOR_INDEX, GL_SHORT, $2)", "writepixels: see man page for glDrawPixels"),
  721.     glArgs("writeRGB", "glDrawPixels($1, 1, GL_RGBA, GL_BYTE, PACK($2, $3, $4))", "writeRGB: see man page for glDrawPixels#\tYouhave to pack the arrays into RGBA"),
  722.     glArgs("zbuffer", "if($1) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST)"),
  723.     glArgs("zfunction", "glDepthFunc($1)"),
  724.     glArgs("zwritemask", "glDepthMask((GLBoolean)($1))",  "glDepthMask is boolean only"),
  725.     glArgs("getbackface", "(glIsEnabled(GL_CULL_FACE) && (glGetIntegerv(GL_CULL_FACE_MODE, &tmp), (tmp == GL_BACK)))", "You can probably do better than this.#long tmp;"),  
  726.     glArgs("getbuffer", "(glGetIntegerv(GL_DRAW_BUFFERS, &tmp),  tmp)", "getbuffer: translate results.#long tmp;"),  
  727.     glArgs("getcmmode", "(glGetBooleanv(GL_INDEX_MODE, &tmp), tmp)", "getcmmode: multimap mode not supported.#long tmp;"),  
  728.     glArgs("getcpos", "{ GLint cpostmp[4]; glGetIntegerv(GL_CURRENT_RASTER_POSITION, cpostmp); *($1) = cpostmp[0]; *($2) = cpostmp[1];}", "getcpos: You can probably do better than this."),  
  729.     glArgs("texgen", "glTexGenfv($1, $2, $3)", "texgen: translate parameters."),
  730.     glArgs("tevdef", "glNewList($1); glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, MODES($3)); glEndList()", "glTexEnvfv:#\tSee man page.#\tTranslate parameters.#\tCheck list numbering."),
  731.     glArgs("texdef2d", "glNewList($1); glTexImage2D(GL_TEXTURE_2D, 0, $2, $3, $4, border, GL_RGBA, GL_UNSIGNED_BYTE, $5); glEndList()", "glTexImage2D:#\tSee man page.#\tIf MipMaps desired, use gluBuild2DMIPmaps().#\tTranslate parameters.#\tSee glTexParameterf().#\tCheck list numbering."),
  732.     glArgs("texbind", "if($2) {glCallList($2); glEnable(GL_TEXTURE_2D);} else glDisable(GL_TEXTURE_2D)", "texbind: check list numbering"),
  733.     glArgs("tevbind", "if($2) {glCallList($2); glEnable(GL_TEXTURE_2D);} else glDisable(GL_TEXTURE_2D)", "tevbind: check list numbering"),
  734.     glArgs("polarview", "glTranslatef(0., 0., -($1)); glRotatef( -($4)*10., 0., 0., 1.); glRotatef( -($3)*10., 1., 0., 0.); glRotatef( -($2)*10., 0., 0., 1);"),
  735. };
  736.  
  737.  
  738. glDefine defines[] = {
  739.     glDefine("SRC_AUTO", "GL_BACK", "SRC_AUTO not really supported -- see glReadBuffer man page"), 
  740.     glDefine("SRC_BACK", "GL_BACK"), 
  741.     glDefine("SRC_FRONT", "GL_FRONT"), 
  742.     glDefine("SRC_ZBUFFER", "XXX", "SRC_ZBUFFER: use GL_DEPTH_COMPONENT in glReadPixels call"), 
  743.     glDefine("SRC_PUP", "GL_AUX0", "XXX which aux buffer is pup planes?"), 
  744.     glDefine("SRC_OVER", "GL_AUX1", "XXX which aux buffer is overlay planes?"), 
  745.     glDefine("SRC_UNDER", "GL_AUX2", "XXX which aux buffer is underlay planes?"), 
  746.     glDefine("SRC_FRAMEGRABBER", "XXX", "SRC_FRAMEGRABBER not supported"), 
  747.     glDefine("BF_ZERO", "GL_ZERO"), 
  748.     glDefine("BF_ONE", "GL_ONE"), 
  749.     glDefine("BF_DC", "GL_DST_COLOR"), 
  750.     glDefine("BF_SC", "GL_SRC_COLOR"), 
  751.     glDefine("BF_MDC", "GL_ONE_MINUS_DST_COLOR"), 
  752.     glDefine("BF_MSC", "GL_ONE_MINUS_SRC_COLOR"), 
  753.     glDefine("BF_SA", "GL_SRC_ALPHA"), 
  754.     glDefine("BF_MSA", "GL_ONE_MINUS_SRC_ALPHA"), 
  755.     glDefine("BF_DA", "GL_DST_ALPHA"), 
  756.     glDefine("BF_MDA", "GL_ONE_MINUS_DST_ALPHA"), 
  757.     glDefine("BF_MIN_SA_MDA", "GL_SRC_ALPHA_SATURATE"), 
  758.     glDefine("AF_NEVER", "GL_NEVER"), 
  759.     glDefine("AF_LESS", "GL_LESS"), 
  760.     glDefine("AF_EQUAL", "GL_EQUAL"), 
  761.     glDefine("AF_LEQUAL", "GL_LEQUAL"), 
  762.     glDefine("AF_GREATER", "GL_GREATER"), 
  763.     glDefine("AF_NOTEQUAL", "GL_NOTEQUAL"), 
  764.     glDefine("AF_GEQUAL", "GL_GEQUAL"), 
  765.     glDefine("AF_ALWAYS", "GL_ALWAYS"), 
  766.     glDefine("ZF_NEVER", "GL_NEVER"), 
  767.     glDefine("ZF_LESS", "GL_LESS"), 
  768.     glDefine("ZF_EQUAL", "GL_EQUAL"), 
  769.     glDefine("ZF_LEQUAL", "GL_LEQUAL"), 
  770.     glDefine("ZF_GREATER", "GL_GREATER"), 
  771.     glDefine("ZF_NOTEQUAL", "GL_NOTEQUAL"), 
  772.     glDefine("ZF_GEQUAL", "GL_GEQUAL"), 
  773.     glDefine("ZF_ALWAYS", "GL_ALWAYS"), 
  774.     glDefine("SMP_OFF", "0"), 
  775.     glDefine("SMP_ON", "1"), 
  776.     glDefine("SMP_SMOOTHER", "1"), 
  777.     glDefine("SML_OFF", "0"), 
  778.     glDefine("SML_ON", "1"), 
  779.     glDefine("SML_SMOOTHER", "1"), 
  780.     glDefine("SML_END_CORRECT", "1"), 
  781.     glDefine("PYSM_OFF", "0"), 
  782.     glDefine("PYSM_ON", "1"), 
  783.     glDefine("PYSM_SHRINK", "1", "PYSM_SHRINK not really supported -- see glEnable man page"), 
  784.     glDefine("DT_OFF", "0"), 
  785.     glDefine("DT_ON", "1"), 
  786.     glDefine("FLAT", "GL_FLAT"), 
  787.     glDefine("GOURAUD", "GL_SMOOTH"), 
  788.     glDefine("LO_ZERO", "GL_CLEAR"),
  789.     glDefine("LO_AND", "GL_AND"),
  790.     glDefine("LO_ANDR", "GL_AND_REVERSE"),
  791.     glDefine("LO_SRC", "GL_COPY"),
  792.     glDefine("LO_ANDI", "GL_AND_INVERTED"),
  793.     glDefine("LO_DST", "GL_NOOP"),
  794.     glDefine("LO_XOR", "GL_XOR"),
  795.     glDefine("LO_OR", "GL_OR"),
  796.     glDefine("LO_NOR", "GL_NOR"),
  797.     glDefine("LO_XNOR", "GL_EQUIV"),
  798.     glDefine("LO_NDST", "GL_INVERT"),
  799.     glDefine("LO_ORR", "GL_OR_REVERSE"),
  800.     glDefine("LO_NSRC", "GL_COPY_INVERTED"),
  801.     glDefine("LO_ORI", "GL_OR_INVERTED"),
  802.     glDefine("LO_NAND", "GL_NAND"),
  803.     glDefine("LO_ONE", "GL_SET"),
  804.     glDefine("ST_KEEP", "GL_KEEP"),
  805.     glDefine("ST_ZERO", "GL_ZERO"),
  806.     glDefine("ST_REPLACE", "GL_REPLACE"),
  807.     glDefine("ST_INCR", "GL_INCR"),
  808.     glDefine("ST_DECR", "GL_DECR"),
  809.     glDefine("ST_INVERT", "GL_INVERT"),
  810.     glDefine("SF_NEVER", "GL_NEVER"),
  811.     glDefine("SF_LESS", "GL_LESS"),
  812.     glDefine("SF_EQUAL", "GL_EQUAL"),
  813.     glDefine("SF_LEQUAL", "GL_LEQUAL"),
  814.     glDefine("SF_GREATER", "GL_GREATER"),
  815.     glDefine("SF_NOTEQUAL", "GL_NOTEQUAL"),
  816.     glDefine("SF_GEQUAL", "GL_GEQUAL"),
  817.     glDefine("SF_ALWAYS", "GL_ALWAYS"),
  818.     glDefine("PYM_FILL", "GL_FILL"),
  819.     glDefine("PYM_POINT", "GL_POINT"),
  820.     glDefine("PYM_LINE", "GL_LINE"),
  821.     glDefine("PYM_HOLLOW", "GL_LINE", "polymode PYM_HOLLOW not supported"),
  822.     glDefine("PYM_LINE_FAST", "GL_LINE"),
  823.     glDefine("FG_OFF", "0"),
  824.     glDefine("FG_ON", "1"),
  825.     glDefine("FG_DEFINE", "XXX fg_define", "see glFogf man page"),
  826.     glDefine("FG_VTX_EXP", "GL_FOG_EXP", "see glFogf man page"),
  827.     glDefine("FG_VTX_LIN", "GL_LINEAR", "see glFogf man page"),
  828.     glDefine("FG_PIX_EXP", "GL_EXP", "see glFogf man page"),
  829.     glDefine("FG_PIX_LIN", "GL_LINEAR", "see glFogf man page"),
  830.     glDefine("FG_VTX_EXP2", "GL_EXP2", "see glFogf man page"),
  831.     glDefine("FG_PIX_EXP2", "GL_EXP2", "see glFogf man page"),
  832.     glDefine("PM_SHIFT", "XXX_SHIFT", "pixmode: see glPixelTransfer man page"),
  833.     glDefine("PM_EXPAND", "XXX_EXPAND", "pixmode: see glPixelTransfer man page"),
  834.     glDefine("PM_C0", "XXX_C0", "pixmode: see glPixelTransfer man page"),
  835.     glDefine("PM_C1", "XXX_C1", "pixmode: see glPixelTransfer man page"),
  836.     glDefine("PM_ADD24", "XXX_ADD24", "pixmode: see glPixelTransfer man page"),
  837.     glDefine("PM_SIZE", "XXX_SIZE", "pixmode: see glPixelTransfer man page"),
  838.     glDefine("PM_OFFSET", "XXX_OFFSET", "pixmode: see glPixelTransfer man page"),
  839.     glDefine("PM_STRIDE", "XXX_STRIDE", "pixmode: see glPixelTransfer man page"),
  840.     glDefine("PM_TTOB", "XXX_TTOB", "pixmode: see glPixelTransfer man page"),
  841.     glDefine("PM_RTOL", "XXX_RTOL", "pixmode: see glPixelTransfer man page"),
  842.     glDefine("PM_ZDATA", "XXX_ZDATA", "pixmode: see glPixelTransfer man page"),
  843.     glDefine("PM_WARP", "XXX_WARP", "pixmode: see glPixelTransfer man page"),
  844.     glDefine("PM_RDX", "XXX_RDX", "pixmode: see glPixelTransfer man page"),
  845.     glDefine("PM_RDY", "XXX_RDY", "pixmode: see glPixelTransfer man page"),
  846.     glDefine("PM_CDX", "XXX_CDX", "pixmode: see glPixelTransfer man page"),
  847.     glDefine("PM_CDY", "XXX_CDY", "pixmode: see glPixelTransfer man page"),
  848.     glDefine("PM_XSTART", "XXX_XSTART", "pixmode: see glPixelTransfer man page"),
  849.     glDefine("PM_YSTART", "XXX_YSTART", "pixmode: see glPixelTransfer man page"),
  850.     glDefine("PM_VO1", "XXX_VO1", "pixmode: see glPixelTransfer man page"),
  851.     glDefine("NAUTO", "0"),
  852.     glDefine("NNORMALIZE", "1"),
  853.     glDefine("AC_CLEAR", "XXX_CLEAR",  "see glAccum man page for how to clear:#glClearAccum(r, g, b, a);#glClear(GL_ACCUM_BUFFER_BIT);"),
  854.     glDefine("AC_ACCUMULATE", "GL_ACCUM"),
  855.     glDefine("AC_CLEAR_ACCUMULATE", "GL_LOAD"),
  856.     glDefine("AC_RETURN", "GL_RETURN"),
  857.     glDefine("AC_MULT", "GL_MULT"),
  858.     glDefine("AC_ADD", "GL_ADD"),
  859.     glDefine("CP_OFF", "0"),
  860.     glDefine("CP_ON", "1"),
  861.     glDefine("CP_DEFINE", "2"),
  862.     glDefine("GD_XPMAX", "XXX_XPMAX", "see window manager"),
  863.     glDefine("GD_YPMAX", "XXX_YPMAX", "see window manager"),
  864.     glDefine("GD_XMMAX", "XXX_XMMAX", "see window manager"),
  865.     glDefine("GD_YMMAX", "XXX_YMMAX", "see window manager"),
  866.     glDefine("GD_ZMIN", "XXX_ZMIN", "ZMIN not needed -- always 0."),
  867.     glDefine("GD_ZMAX", "XXX_ZMAX", "ZMAX not needed -- always 1."),
  868.     glDefine("GD_BITS_NORM_SNG_RED", "GL_RED_BITS"),
  869.     glDefine("GD_BITS_NORM_SNG_GREEN", "GL_GREEN_BITS"),
  870.     glDefine("GD_BITS_NORM_SNG_BLUE", "GL_BLUE_BITS"),
  871.     glDefine("GD_BITS_NORM_DBL_RED", "GL_RED_BITS"),
  872.     glDefine("GD_BITS_NORM_DBL_GREEN", "GL_GREEN_BITS"),
  873.     glDefine("GD_BITS_NORM_DBL_BLUE", "GL_BLUE_BITS"),
  874.     glDefine("GD_BITS_NORM_SNG_CMODE", "GL_INDEX_BITS"),
  875.     glDefine("GD_BITS_NORM_DBL_CMODE", "GL_INDEX_BITS"),
  876.     glDefine("GD_BITS_NORM_SNG_MMAP", "GL_INDEX_BITS", "multi-map not supported"),
  877.     glDefine("GD_BITS_NORM_DBL_MMAP", "GL_INDEX_BITS", "multi-map not supported"),
  878.     glDefine("GD_BITS_NORM_ZBUFFER", "GL_DEPTH_BITS"),
  879.     glDefine("GD_BITS_OVER_SNG_CMODE", "XXX_BITS_OVER_SNG_CMODE", "XXX what to do?"),
  880.     glDefine("GD_BITS_UNDR_SNG_CMODE", "XXX_BITS_UNDR_SNG_CMODE", "XXX what to do?"),
  881.     glDefine("GD_BITS_PUP_SNG_CMODE", "XXX_BITS_PUP_SNG_CMODE", "XXX what to do?"),
  882.     glDefine("GD_BITS_NORM_SNG_ALPHA", "GL_ALPHA_BITS"),
  883.     glDefine("GD_BITS_NORM_DBL_ALPHA", "GL_ALPHA_BITS"),
  884.     glDefine("GD_BITS_CURSOR", "XXX_BITS_CURSOR", "cursor bits not supported"),
  885.     glDefine("GD_OVERUNDER_SHARED", "XXX_OVERUNDER_SHARED", "overunder_shared: not supported"),
  886.     glDefine("GD_BLEND", "GL_BLEND", "blending is ALWAYS supported.#This function returns whether it is enabled."),
  887.     glDefine("GD_CIFRACT", "XXX_CIFRACT", "CIFRACT irrelevant"),
  888.     glDefine("GD_CROSSHAIR_CINDEX", "XXX_CROSSHAIR_CINDEX", "cursors not supported -- see window manager"),
  889.     glDefine("GD_DITHER", "GL_DITHER", "dither ALWAYS supported.#This function returns whether it is enabled."),
  890.     glDefine("GD_LINESMOOTH_CMODE", "GL_LINE_SMOOTH", "smooth lines ALWAYS supported.#This function returns whether it is enabled."),
  891.     glDefine("GD_LINESMOOTH_RGB", "GL_LINE_SMOOTH", "smooth lines ALWAYS supported.#This function returns whether it is enabled."),
  892.     glDefine("GD_LOGICOP", "GL_LOGICOP", "logic ops ALWAYS supported.#This function returns whether it is enabled."),
  893.     glDefine("GD_NSCRNS", "XXX_NSCRNS", "nscrns not supported -- see window manager"),
  894.     glDefine("GD_NURBS_ORDER", "GL_MAX_EVAL_ORDER"),
  895.     glDefine("GD_NBLINKS", "XXX_NBLINKS", "blink not supported -- see window manager"),
  896.     glDefine("GD_NVERTEX_POLY", "XXX_NVERTEX_POLY", "There is NO limit to the number of vertices in a polygon."),
  897.     glDefine("GD_PATSIZE_64", "XXX_PATSIZE_64", "all patterns are the same size"),
  898.     glDefine("GD_PNTSMOOTH_CMODE", "GL_POINT_SMOOTH", "Smooth points ALWAYS supported.#This function returns whether it is enabled."),
  899.     glDefine("GD_PNTSMOOTH_RGB", "GL_POINT_SMOOTH", "Smooth points ALWAYS supported.#This function returns whether it is enabled."),
  900.     glDefine("GD_PUP_TO_OVERUNDER", "XXX_PUP_TO_OVERUNDER", "pup_to_overunder: not supported"),
  901.     glDefine("GD_READSOURCE", "GL_READ_BUFFER", "read buffer ALWAYS supported.#This function returns whether it is enabled."),
  902.     glDefine("GD_READSOURCE_ZBUFFER", "GL_READ_BUFFER", "read buffer ALWAYS supported.#This function returns whether it is enabled."),
  903.     glDefine("GD_STEREO", "GL_STEREO"),
  904.     glDefine("GD_SUBPIXEL_LINE", "XXX_SUBPIXEL_LINE", "subpixel ALWAYS supported"),
  905.     glDefine("GD_SUBPIXEL_PNT", "GL_SUBPIXEL_PNT", "subpixel ALWAYS supported"),
  906.     glDefine("GD_SUBPIXEL_POLY", "GL_SUBPIXEL_POLY", "subpixel ALWAYS supported"),
  907.     glDefine("GD_TRIMCURVE_ORDER", "GL_MAX_EVAL_ORDER", "XXX see glu man pages"),
  908.     glDefine("GD_WSYS", "XXX_WSYS",  "see window manager"),
  909.     glDefine("GD_ZDRAW_GEOM", "XXX_ZDRAW_GEOM", "zdraw not supported"),
  910.     glDefine("GD_ZDRAW_PIXELS", "XXX_ZDRAW_PIXELS", "zdraw not supported"),
  911.     glDefine("GD_SCRNTYPE", "XXX_SCRNTYPE", "see window manager"),
  912.     glDefine("GD_TEXTPORT", "XXX_TEXTPORT", "see window manager"),
  913.     glDefine("GD_NMMAPS", "XXX_NMMAPS", "multimap not supported -- see window manager"),
  914.     glDefine("GD_FRAMEGRABBER", "XXX_FRAMEGRABBER", "framegrabber not supported"),
  915.     glDefine("GD_TIMERHZ", "XXX_TIMERHZ", "timers not supported -- use event functions."),
  916.     glDefine("GD_DBBOX", "XXX_DBBOX", "devices not supported -- use event functions."),
  917.     glDefine("GD_AFUNCTION", "GL_ALPHA_TEST", "alpha test ALWAYS supported.#This function returns whether is is enabled."),
  918.     glDefine("GD_ALPHA_OVERUNDER", "XXX_ALPHA_OVERUNDER", "alpha_overunder: not supported"),
  919.     glDefine("GD_BITS_ACBUF", "GL_ACCUM_RED_BITS", "see glAccum man page."),
  920.     glDefine("GD_BITS_ACBUF_HW", "GL_ACCUM_RED_BITS", "see glAccum man page."),
  921.     glDefine("GD_BITS_STENCIL", "GL_STENCIL_BITS"),
  922.     glDefine("GD_CLIPPLANES", "GL_MAX_CLIP_PLANES"),
  923.     glDefine("GD_FOGVERTEX", "GL_FOG", "Fog ALWAYS supported.#This function returns whether is is enabled."),
  924.     glDefine("GD_LIGHTING_TWOSIDE", "XXX_LIGHTING_TWOSIDE", "Twosided lighting ALWAYS supported.#This function returns whether is is enabled."),
  925.     glDefine("GD_POLYMODE", "GL_POLYGON_MODE", "polygon mode ALWAYS supported.#This function returns whether is is enabled."),
  926.     glDefine("GD_POLYSMOOTH", "GL_POLYGON_SMOOTH", "Smooth polygons ALWAYS supported.#This function returns whether is is enabled."),
  927.     glDefine("GD_SCRBOX", "XXX_SCRBOX", "scrbox not supported"),
  928.     glDefine("GD_TEXTURE", "GL_TEXTURE_2D", "Texture ALWAYS supported.#This function returns whether is is enabled."),
  929.     glDefine("GD_FOGPIXEL", "GL_FOG", "Fog ALWAYS supported.#This function returns whether is is enabled."),
  930.     glDefine("GD_TEXTURE_PERSP", "GL_TEXTURE_2D", "Texture ALWAYS supported.#This function returns whether is is enabled."),
  931.     glDefine("GD_MUXPIPES", "XXX_MUXPIPES", "muxpipes: not supported -- See Window Manager?"),
  932.     glDefine("MSINGLE", "GL_MODELVIEW","MSINGLE not supported"),
  933.     glDefine("MPROJECTION", "GL_PROJECTION"),
  934.     glDefine("MVIEWING", "GL_MODELVIEW"),
  935.     glDefine("MTEXTURE", "GL_TEXTURE"),
  936.     glDefine("STR_B", "GL_UNSIGNED_BYTE"),
  937.     glDefine("STR_2B", "GL_2_BYTES"),
  938.     glDefine("STR_3B", "GL_3_BYTES"),
  939.     glDefine("STR_4B", "GL_4_BYTES"),
  940.     glDefine("STR_16", "GL_UNSIGNED_SHORT"),
  941.     glDefine("STR_32", "GL_UNSIGNED_INT"),
  942.     glDefine("LMC_COLOR", "XXX lmc_COLOR",  "LMC_COLOR: use glDisable(GL_COLOR_MATERIAL);"),
  943.     glDefine("LMC_EMISSION", "GL_EMISSION"),
  944.     glDefine("LMC_AMBIENT", "GL_AMBIENT"),
  945.     glDefine("LMC_DIFFUSE", "GL_DIFFUSE"),
  946.     glDefine("LMC_SPECULAR", "GL_SPECULAR"),
  947.     glDefine("LMC_AD", "GL_AMBIENT_AND_DIFFUSE"),
  948.     glDefine("LMC_NULL", "XXX_LMC_NULL",  "LMC_NULL: use glDisable(GL_COLOR_MATERIAL);"),
  949.     glDefine("TX_MINFILTER", "GL_TEXTURE_MIN_FILTER"),
  950.     glDefine("TX_MAGFILTER", "GL_TEXTURE_MAG_FILTER"),
  951.     glDefine("TX_WRAP", "XXX_TX_WRAP", "TX_WRAP not supported: see glTexParameterfv man page."),
  952.     glDefine("TX_WRAP_S", "GL_TEXTURE_WRAP_S"),
  953.     glDefine("TX_WRAP_T", "GL_TEXTURE_WRAP_T"),
  954.     glDefine("TX_TILE", "XXX_TX_TILE", "TX_TILE not supported: see glTexParamterfv man page."),
  955.     glDefine("TX_BORDER", "XXX_TX_BORDER", "Border needs to be added to glTexImage2D parameters"),
  956.     glDefine("TX_NULL", ""),
  957.     glDefine("TV_NULL", ""),
  958.     glDefine("TX_POINT", "GL_NEAREST"),
  959.     glDefine("TX_BILINEAR", "GL_LINEAR"),
  960.     glDefine("TX_MIPMAP", "GL_NEAREST_MIPMAP_LINEAR"),
  961.     glDefine("TX_MIPMAP_POINT", "GL_NEAREST_MIPMAP_NEAREST"),
  962.     glDefine("TX_MIPMAP_LINEAR", "GL_NEAREST_MIPMAP_LINEAR"),
  963.     glDefine("TX_MIPMAP_BILINEAR", "GL_LINEAR_MIPMAP_NEAREST"),
  964.     glDefine("TX_MIPMAP_TRILINEAR", "GL_LINEAR_MIPMAP_LINEAR"),
  965.     glDefine("TV_MODULATE", "GL_MODULATE"),
  966.     glDefine("TV_BLEND", "GL_BLEND", "XXX is there a problem with GL_BLEND?"),
  967.     glDefine("TV_DECAL", "GL_DECAL"),
  968.     glDefine("TV_COLOR", "GL_TEXTURE_ENV_COLOR",  "env_color: see glTexEnv man page"),
  969.     glDefine("TX_S", "GL_S"),
  970.     glDefine("TX_T", "GL_T"),
  971.     glDefine("TX_REPEAT", "GL_REPEAT"),
  972.     glDefine("TX_CLAMP", "GL_CLAMP"),
  973.     glDefine("TX_SELECT", "XXX_SELECT", "TX_SELECT not supported"),
  974.     glDefine("TG_OFF", "XXX_TG_OFF", "tg_off use: #glDisable(GL_TEXTURE_GEN_S);#glDisable(GL_TEXTURE_GEN_T);"),
  975.     glDefine("TG_ON", "XXX_TG_ON", "tg_on use: #glEnable(GL_TEXTURE_GEN_S);#glEnable(GL_TEXTURE_GEN_T);"),
  976.     glDefine("TG_CONTOUR", "GL_TG_CONTOUR"),
  977.     glDefine("TG_LINEAR", "GL_EYE_LINEAR"),
  978.     glDefine("TG_SPHEREMAP", "GL_SPHERE_MAP"),
  979.     glDefine("TV_ENV0", "GL_TEXTURE_ENV"),
  980.     glDefine("TX_TEXTURE_0", "GL_TEXTURE_2D"),
  981.     glDefine("GC_BITS_CMODE", "GL_INDEX_BITS"),
  982.     glDefine("GC_BITS_RED", "GL_RED_BITS"),
  983.     glDefine("GC_BITS_GREEN", "GL_GREEN_BITS"),
  984.     glDefine("GC_BITS_BLUE", "GL_BLUE_BITS"),
  985.     glDefine("GC_BITS_ALPHA", "GL_ALPHA_BITS"),
  986.     glDefine("GC_BITS_ZBUFFER", "GL_DEPTH_BITS"),
  987.     glDefine("GC_ZMIN", "XXX_ZMIN", "getgconfig: ZMIN always 0"),
  988.     glDefine("GC_ZMAX", "XXX_Z_MAX", "getgconfig: ZMAX always 1"),
  989.     glDefine("GC_BITS_STENCIL", "GL_STENCIL_BITS"),
  990.     glDefine("GC_BITS_ACBUF", "GL_ACCUM_RED_BITS", "BITS_ACBUF: add together all red, grn, blu, alp bits."),
  991.     glDefine("GC_MS_SAMPLES", "XXX_MS_SAMPLES", "multisample not supported in base OpenGL"),
  992.     glDefine("GC_BITS_MS_ZBUFFER", "XXX_MS_ZBUFFER", "multisample not supported in base OpenGL"),
  993.     glDefine("GC_MS_ZMIN", "XXX_MS_ZMIN", "zmin always 0.#multisample not supported in base OpenGL"),
  994.     glDefine("GC_MS_ZMAX", "XXX_MS_ZMAX", "zmax always 1.#multisample not supported in base OpenGL"),
  995.     glDefine("GC_BITS_MS_STENCIL", "GL_STENCIL_BITS", "multisample not supported in base OpenGL"),
  996.     glDefine("GC_STEREO", "GL_STEREO"),
  997.     glDefine("GC_DOUBLE", "GL_DOUBLEBUFFER"),
  998.     glDefine("Byte", "GLbyte"),
  999.     glDefine("Boolean", "GLboolean"),
  1000.     glDefine("String", "GLbyte *"),
  1001.     glDefine("Lstring", "GLint *"),
  1002.     glDefine("Angle", "GLfloat"),
  1003.     glDefine("Screencoord", "GLuint"),
  1004.     glDefine("Scoord", "GLshort"),
  1005.     glDefine("Icoord", "GLint"),
  1006.     glDefine("Coord", "GLfloat"),
  1007.     glDefine("Matrix", "GLfloat *",  "XXX fix this."),
  1008.     glDefine("Colorindex", "GLshort"),
  1009.     glDefine("RGBvalue", "GLuint"),
  1010.     glDefine("Pattern16", "GLuint *", "XXX see glPolygonStipple man page"),
  1011.     glDefine("Pattern32", "GLuint *", "XXX see glPolygonStipple man page"),
  1012.     glDefine("Pattern64", "GLuint *", "XXX see glPolygonStipple man page"),
  1013.     glDefine("Linestyle", "GLuint *", "XXX see glLineStipple man page"),
  1014.     glDefine("Object", "GLuint"),
  1015.     
  1016.  
  1017. };
  1018.  
  1019. static int possible_hits[MAXPATTERN];
  1020. static int replacements[MAXPATTERN];
  1021.  
  1022. static void
  1023. print_hits()
  1024. {
  1025.     int i;
  1026.     cerr << "Possible hits & replacements made for " << lineno << " lines:\n";
  1027.     for(i = 0; i < MAXPATTERN; i++) {
  1028.     cerr << i << ":\t" << possible_hits[i] ;
  1029.     cerr << "\t" << replacements[i] << "\n";
  1030.     }
  1031. }
  1032.  
  1033. void
  1034. process_line()
  1035. {
  1036.     int i;
  1037.     PerlStringList s;
  1038.     glThing *p;
  1039.     
  1040.     ostr = instr;
  1041.     
  1042.     for(i = 0; i < MAXPATTERN; i++) {
  1043.     if(first_glThing[i] && search[i].check(ostr)) { // if we have a possible match here...
  1044.         possible_hits[i]++;
  1045.         for(p = first_glThing[i];p;p = p->next()) {
  1046.         int junk;   // junk not used -- avoids a compiler bug
  1047.         while(junk = p->m(ostr, s)) {
  1048.             p->replace(ostr, s);
  1049.             s.reset();
  1050.             replacements[i]++;
  1051.         }
  1052.         }
  1053.     }
  1054.     }
  1055. }
  1056.  
  1057. void
  1058. print_line()
  1059. {
  1060.     if(!comments.isempty()) {
  1061.     if(!no_comments) {
  1062.         if(comments.scalar() == 1) {
  1063.         cout << "\t/* OGLXXX " << comments[0] << " */\n";
  1064.         } else {
  1065.         cout << "\t/* OGLXXX\n\t * " << comments.join("\n\t * ") << "\n\t */\n";
  1066.         }
  1067.     }
  1068.     comments.reset();
  1069.     }
  1070.     ostr = ostr.substr(1, ostr.length() - 2);    // remove first and last " " added by read_line
  1071.     cout << ostr << '\n';
  1072.     
  1073.     if(debug)
  1074.     cout.flush();
  1075. }
  1076.  
  1077. void
  1078. init_optional_functions()
  1079. {
  1080.     if(!no_window) {
  1081.     new     glDelete("wintitle", "wintitle not supported -- See Window Manager");
  1082.     new     glDelete("winset", "winset not supported -- See Window Manager");
  1083.     new     glDelete("winpush", "winpush not supported -- See Window Manager");
  1084.     new     glDelete("winposition", "winposition not supported -- See Window Manager");
  1085.     new     glDelete("winpop", "winpop not supported -- See Window Manager");
  1086.     new     glDelete("winopen", "winopen not supported -- See Window Manager");
  1087.     new     glDelete("winmove", "winmove not supported -- See Window Manager");
  1088.     new     glDelete("winget", "winget not supported -- See Window Manager");
  1089.     new     glDelete("windepth", "windepth not supported -- See Window Manager");
  1090.     new     glDelete("winconstraints", "winconstraints not supported -- See Window Manager");
  1091.     new     glDelete("winclose", "winclose not supported -- See Window Manager");
  1092.     new     glDelete("videocmd", "videocmd not supported");
  1093.     new     glDelete("tpon", "tpon not supported");
  1094.     new     glDelete("tpoff", "tpoff not supported");
  1095.     new     glDelete("textport", "textport not supported");
  1096.     new     glDelete("textinit", "textinit not supported");
  1097.     new     glDelete("textcolor", "textcolor not supported -- See Fonts");
  1098.     new     glDelete("swinopen", "swinopen not supported -- See Window Manager");
  1099.     new     glDelete("stepunit", "stepunit not supported -- See Window Manager");
  1100.     new     glDelete("setvideo", "setvideo not supported");
  1101.     new     glDelete("setmonitor", "setmonitor not supported");
  1102.     new     glDelete("setmap", "setmap not supported -- See Window Manager");
  1103.     new     glDelete("setdblights", "setdblights not supported -- See Window Manager");
  1104.     new     glDelete("setbell", "setbell not supported -- See Window Manager");
  1105.     new     glDelete("scrnselect", "scrnselect not supported -- See Window Manager");
  1106.     new     glDelete("scrnattach", "scrnattach not supported -- See Window Manager");
  1107.     new     glDelete("screenspace", "screenspace not supported");
  1108.     new     glDelete("ringbell", "ringbell not supported -- See Window Manager");
  1109.     new     glDelete("reshapeviewport", "reshapeviewport not supported -- See Window Manager");
  1110.     new     glDelete("prefposition", "prefposition not supported -- See Window Manager");
  1111.     new     glDelete("prefsize", "prefsize not supported -- See Window Manager");
  1112.     new     glDelete("onemap", "onemap not supported -- See Window Manager");
  1113.     new     glDelete("noborder", "noborder not supported -- See Window Manager");
  1114.     new     glDelete("multimap", "multimap not supported -- See Window Manager?");
  1115.     new     glDelete("mswapbuffers", "mswapbuffers not supported -- See Window Manager");
  1116.     new     glDelete("mapcolor", "mapcolor not supported -- See Window Manager");
  1117.     new     glDelete("imakebackground", "imakebackground not supported -- See Window Manager");
  1118.     new     glDelete("icontitle", "icontitle not supported -- See Window Manager");
  1119.     new     glDelete("iconsize", "iconsize not supported -- See Window Manager");
  1120.     new     glDelete("greset", "greset not supported -- See Window Manager");
  1121.     new     glDelete("ginit", "ginit not supported -- See Window Manager");
  1122.     new     glDelete("gexit", "gexit not supported -- See Window Manager#\tThere's bound to be something you have to do!");
  1123.     new     glDelete("getwscrn", "getwscrn not supported -- See Window Manager");
  1124.     new     glDelete("getvideo", "getvideo not supported");
  1125.     new     glDelete("getsize", "getsize not supported -- See Window Manager");
  1126.     new     glDelete("getorigin", "getorigin not supported -- See Window Manager");
  1127.     new     glDelete("getmcolor", "getmcolor not supported -- See Window Manager");
  1128.     new     glDelete("getmonitor", "getmonitor not supported");
  1129.     new     glDelete("getmap", "getmap not supported");
  1130.     new     glDelete("getbutton", "getbutton not supported -- See Window Manager");
  1131.     new     glDelete("gammaramp", "gammaramp not supported");
  1132.     new     glDelete("fullscrn", "fullscrn not supported");
  1133.     new     glDelete("fudge", "fudge not supported");
  1134.     new     glDelete("endfullscrn", "endfullscrn not supported");
  1135.     new     glDelete("dglopen", "dglopen not supported");
  1136.     new     glDelete("dglclose", "dglclose not supported");
  1137.     new     glDelete("dbtext", "dbtext not supported, see Window Manager");
  1138.     new     glDelete("defcursor", "defcursor not supported, see Window Manager");
  1139.     new     glDelete("cyclemap", "cyclemap not supported, see Window Manager?");
  1140.     new     glDelete("curstype", "curstype not supported");
  1141.     new     glDelete("curson", "curson not supported");
  1142.     new     glDelete("cursoff", "cursoff not supported");
  1143.     new     glDelete("curorigin", "curorigin not supported");
  1144.     new     glDelete("blink", "blink not supported, see Window Manager");
  1145.     new     glDelete("blanktime", "blanktime not supported, see Window Manager");
  1146.     new     glDelete("blankscreen", "blankscreen not supported, see Window Manager");
  1147.     new     glDelete("winattach", "winattach obsolete -- see Window Manager");
  1148.     new     glDelete("setcursor", "setcursor not supported -- see Window Manager");
  1149.     new     glDelete("RGBcursor", "RGBcursor obsolete -- see Window Manager");
  1150.     new     glDelete("getcursor", "getcursor not supported -- see Window Manager?");
  1151.     new     glSimple("swapbuffers", "glXSwapBuffers(*display, window)", "swapbuffers: replace display and window");
  1152.     new     glSimple("singlebuffer", "glxChooseVisual(*dpy, screen, *attriblist)", "singlebuffer: don't use GLX_DOUBLEBUFFER in attriblist");
  1153.     new     glSimple("doublebuffer", "glxChooseVisual(*dpy, screen, *attriblist)", "doublebuffer: use GLX_DOUBLEBUFFER in attriblist");
  1154.     new     glSimple("cmode", "glxChooseVisual(*dpy, screen, *attriblist)", "cmode: use GLX_BUFFER_SIZE, 1024 in attriblist");
  1155.     new     glSimple("RGBmode",  "glxChooseVisual(*dpy, screen, *attriblist)", "RGBmode: use GLX_RGBA in attriblist");
  1156.     new    glDelete("gbegin", "gbegin not supported -- See Window Manager");
  1157.     new    glDelete("getport", "getport obsolete -- see Window Manager");
  1158.     new    glDelete("keepaspect", "keepaspect not supported -- See Window Manager");
  1159.     new    glDelete("maxsize", "maxsize not supported -- See Window Manager");
  1160.     new    glDelete("minsize", "minsize not supported -- See Window Manager");
  1161.     new     glDelete("clkon", "clkon not supported");
  1162.     new     glDelete("clkoff", "clkoff not supported");
  1163.     new     glDelete("lampoff", "lampoff not supported -- See Window Manager");
  1164.     new     glDelete("lampon", "lampon not supported -- See Window Manager");
  1165.     new     glDelete("attachcursor", "attachcursor not supported -- See Window Manager");
  1166.     }
  1167.     if(!no_queue) {
  1168.     new     glDelete("blkqread", "blkqread not supported, see Events"); // XXX X equivalent?
  1169.     new     glDelete("getvaluator", "getvaluator not supported -- See Events");
  1170.     new     glDelete("isqueued", "isqueued not supported -- See Events");
  1171.     new     glDelete("noise", "noise not supported -- See Events");
  1172.     new     glDelete("qdevice", "qdevice not supported -- See Events");
  1173.     new     glDelete("qenter", "qenter not supported -- See Events");
  1174.     new     glDelete("qgetfd", "qgetfd not supported -- See Events");
  1175.     new     glDelete("qread", "qread not supported -- See Events");
  1176.     new     glDelete("qreset", "qreset not supported -- See Events");
  1177.     new     glDelete("qtest", "qtest not supported -- See Events");
  1178.     new     glDelete("setvaluator", "setvaluator not supported -- See Events");
  1179.     new     glDelete("tie", "tie not supported -- See Events");
  1180.     new     glDelete("unqdevice", "unqdevice not supported -- See Events");
  1181.     new     glDelete("unqdevice", "unqdevice not supported -- See Events");
  1182.     new    glDelete("getdev", "getdev not supported -- See Events");
  1183.     new    glDelete("qcontrol", "qcontrol not supported -- See Events");
  1184.     }
  1185.     if(!no_lighting) {
  1186.     new glDefine("MAXLIGHTS", "(glGetIntegerv(GL_MAX_LIGHTS, &tmp), tmp)", "maxlights:#GLint tmp;");
  1187.     new glDefine("MATERIAL", "GL_FRONT", "Use GL_FRONT in call to glMaterialf.");
  1188.     new glDefine("BACKMATERIAL", "GL_BACK", "Use GL_BACK in call to glMaterialf.");
  1189.     new glDefine("LIGHT7", "GL_LIGHT7");
  1190.     new glDefine("LIGHT6", "GL_LIGHT6");
  1191.     new glDefine("LIGHT5", "GL_LIGHT5");
  1192.     new glDefine("LIGHT4", "GL_LIGHT4");
  1193.     new glDefine("LIGHT3", "GL_LIGHT3");
  1194.     new glDefine("LIGHT2", "GL_LIGHT2");
  1195.     new glDefine("LIGHT1", "GL_LIGHT1");
  1196.     new glDefine("LIGHT0", "GL_LIGHT0");
  1197.     new glDefine("LMNULL", "");
  1198.     new glDefine("TWOSIDE", "GL_LIGHT_MODEL_TWO_SIDE", "light model parameters need to be moved into a glLightModelf call.");
  1199.     new glDefine("ATTENUATION2", "GL_QUADRATIC_ATTENUATION");
  1200.     new glDefine("ATTENUATION", "GL_CONSTANT_ATTENUATION", "attenuation: see glLightf man page:#Add GL_LINEAR_ATTENUATION.");
  1201.     new glDefine("LOCALVIEWER", "GL_LIGHT_MODEL_LOCAL_VIEWER", "light model parameters need to be moved into a glLightModelf call.");
  1202.     new glDefine("SPOTLIGHT", "XXX_SPOTLIGHT", "see glLightf man page#Add GL_SPOT_EXPONENT and GL_SPOT_CUTOFF parameters.");
  1203.     new glDefine("POSITION", "GL_POSITION");
  1204.     new glDefine("LCOLOR", "GL_DIFFUSE", "light color: need to add GL_AMBIENT and GL_SPECULAR components.#ALPHA needs to be included in parameters.");
  1205.     new glDefine("COLORINDEXES", "GL_COLOR_INDEXES");
  1206.     new glDefine("ALPHA", "XXX_ALPHA", "alpha is to be included with other parameters");
  1207.     new glDefine("SHININESS", "GL_SHININESS");
  1208.     new glDefine("SPECULAR", "GL_SPECULAR", "include ALPHA parameter with specular");
  1209.     new glDefine("DIFFUSE", "GL_DIFFUSE", "include ALPHA parameter with diffuse");
  1210.     new glDefine("AMBIENT", "GL_AMBIENT", "Ambient:#\tIf this is a light model lmdef, then use glLightModelf and GL_LIGHT_MODEL_AMBIENT.#Include ALPHA parameter with ambient");
  1211.     new glDefine("EMISSION", "GL_EMISSION", "include ALPHA parameter with emission");
  1212.     new glDefine("SPOTDIRECTION", "GL_SPOT_DIRECTION");
  1213.     new glArgs("lmbind", "if($2) {glCallList($2); glEnable($1);} else glDisable($1)",  "lmbind: check object numbering."), 
  1214.     new glArgs("lmdef", "glNewList($2, GL_COMPILE); glMaterialf(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, *$4); glEndList();", "lmdef other possibilities include:#\tglLightf(light, pname, *params);#\tglLightModelf(pname, param);#Check list numbering.#Translate params as needed.");
  1215.      }
  1216.     if(emulate_lighting) {
  1217.     new glArgs("lmbind", "mylmbind($1, $2)"), 
  1218.     new glArgs("lmdef", "mylmdef($1, $2, $3, $4)");
  1219.      }
  1220. }
  1221.  
  1222.  
  1223. int 
  1224. main(int argc, char **argv)
  1225. {
  1226.     options(argc, argv);
  1227.     init_optional_functions();
  1228.         
  1229.     while(read_line()) {
  1230.     process_line();
  1231.     print_line();
  1232.     }
  1233.     
  1234.     if(debug) 
  1235.     print_hits();
  1236.     
  1237.     return errors; 
  1238. }
  1239.  
  1240.  
  1241. /*
  1242.  * return offset to matching parenthesis or quote characters
  1243.  * returns 0 if none found.
  1244.  * paren or quote must be first char.
  1245.  */
  1246. int matching(const char *in, int offset)
  1247. {
  1248.     const char *s = &in[offset];
  1249.     int r;
  1250.     int c, m;
  1251.     
  1252.     if(*s == '(')
  1253.     m = ')';
  1254.     else if(*s == '"') 
  1255.     m = '"';
  1256.     else {
  1257.     return 0;
  1258.     }
  1259.     
  1260.     s++;
  1261.     
  1262.     while((c = *s)&& (c != m)) {
  1263.     if(c == '(' && m != '"') {  // don't look at stuff in quotes
  1264.         if(!(r = matching(s)))
  1265.         return 0;
  1266.         s += r + 1;    
  1267.     } else if(c == '"') {
  1268.         if(!(r = matching(s)))
  1269.         return 0;
  1270.         s += r + 1;
  1271.     } else
  1272.         s += 1;
  1273.     }
  1274.     if(!c || c != m)
  1275.     return 0;
  1276.     else
  1277.     return s - &in[offset];
  1278. }
  1279.  
  1280. PerlStringList split_args( PerlString &in,  int &ok)
  1281. {
  1282.     PerlStringList results(10);
  1283.     ok = 1;
  1284.     
  1285.     int r = matching(in);
  1286.     if(r == 0) {        // no args possible
  1287.     error( "un-matched parenthesis or quote");
  1288.     ok = 0;
  1289.     results.reset();
  1290.     return results;
  1291.     }
  1292.     
  1293.     results.push("(");
  1294.     
  1295.     PerlString s = in.substr(1, r-1);    // get arg list without ()'s
  1296.     PerlString rest = in.substr(r+1); // rest of input after ')'
  1297.     
  1298.     int i = 0;
  1299.     int j = 0;
  1300.     int c;
  1301.     
  1302.     while(i < s.length()) {
  1303.     c = s[i];
  1304.     if(c == '(' || c == '"') {
  1305.         r = matching(s, i);
  1306.         if(!r) {
  1307.         error("un-matched paren or quote");
  1308.         ok = 0;
  1309.         results.reset();
  1310.         break;
  1311.         }
  1312.         i += r + 1;
  1313.     } else if(c == ',') {
  1314.         results.push(s.substr(j, i-j));
  1315.         i++;
  1316.         j = i;
  1317.     } else
  1318.         i++;
  1319.     }
  1320.     
  1321.     results.push(s.substr(j, i-j));
  1322.     results.push(")");
  1323.     results.push(rest);
  1324.     
  1325.     return results;
  1326. }
  1327.  
  1328. #if TEST_MATCH
  1329.  
  1330. main() {
  1331.     PerlString istr;
  1332.     do {
  1333.     cin >> istr;
  1334.     PerlStringList a = split_args (istr);
  1335.     
  1336.     cout << a.join("\n") << '\n';
  1337.     } while(!cin.eof());
  1338. }
  1339. #endif
  1340.  
  1341. // replace "$n" in input string with args[n] (1 based)
  1342. // $1 - $9, $a - $f, or $A - $F work
  1343. // no check is made for $<anything else> or $ at end of string!
  1344.  
  1345. void replace_args(PerlString &in, const PerlStringList &args)
  1346. {
  1347.     int j, n;    
  1348.     
  1349.     while((j = in.index("$")) >= 0) {
  1350.     n = in[j+1];
  1351.     if(n >= '1' && n <= '9') 
  1352.         n -= '1';
  1353.     else if (n >= 'a' && n <= 'f') 
  1354.         n = n - 'a' + 9;
  1355.     else if (n >= 'A' && n <= 'F') 
  1356.         n = n - 'A' + 9;
  1357.     if(n >= args.scalar()) {
  1358.         error("Not enough arguments for function or other wierdness");
  1359.         return;
  1360.     }
  1361.           
  1362.     in.substr(j, 2) = args[n];
  1363.     }
  1364. }
  1365.